Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand Down Expand Up @@ -42,4 +44,16 @@ public ResponseEntity<Void> 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();
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,18 @@ 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(),
member.getOauthInfo().getOauthProvider(),
member.getNickname(),
member.getProfileImageUrl(),
member.getStatus(),
member.getRole());
member.getRole(),
member.getServiceAlarmAgree(),
member.getMarketingAgree());
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@

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();

MemberProfileUpdateResponse updateProfile(MemberProfileUpdateRequest request);

void saveFcmToken(FcmTokenSaveRequest request);

ServiceAlarmAgreeToggleResponse toggleServiceAlarmAgree();

MarketingAgreeToggleResponse toggleMarketingAgree();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,7 @@ class 앨범_수정_요청_시 {
}

@Nested
class 앨범_권한_부여_토글_상태_변경_요청_시 {
class 멤버별_권한_부여_상태_변경_요청_시 {

@Test
void 유효한_요청이면_권한_부여_토글_상태를_반환한다() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,7 @@ void setUp() {
}

@Nested
class 앨범_권한_부여_토글_상태를_변경_할_때 {
class 멤버별_권한_부여_상태를_변경할_때 {

@BeforeEach
void setUp() {
Expand Down Expand Up @@ -572,7 +572,7 @@ void setUp() {
}

@Test
void 유효한_요청이면_앨범의_권한_부여_상태가_변경되고_LIMITED_참가자_권한이_STANDARD로_수정된다() {
void 유효한_요청이면_멤버별_권한_부여_상태를_변경하고_LIMITED_참가자들의_권한을_STANDARD로_변경한다() {
// when
albumService.togglePermission(1L);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -51,7 +53,9 @@ class 회원_정보_조회_요청_시 {
"testNickname",
"testProfileImageUrl",
MemberStatus.NORMAL,
MemberRole.USER);
MemberRole.USER,
Boolean.FALSE,
Boolean.FALSE);

given(memberService.getMemberInfo()).willReturn(response);

Expand All @@ -66,7 +70,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"));
}
}

Expand Down Expand Up @@ -202,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"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -155,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();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ public class Member extends BaseTimeEntity {
@Enumerated(EnumType.STRING)
private MemberStatus status;

@NotNull private Boolean appAlarm = Boolean.FALSE;
@NotNull private Boolean serviceAlarmAgree;

@NotNull private Boolean marketingAgree;

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Payment> payments = new ArrayList<>();
Expand All @@ -56,12 +58,16 @@ private Member(
String nickname,
String profileImageUrl,
MemberRole role,
MemberStatus status) {
MemberStatus status,
Boolean serviceAlarmAgree,
Boolean marketingAgree) {
this.oauthInfo = oauthInfo;
this.nickname = nickname;
this.profileImageUrl = profileImageUrl;
this.role = role;
this.status = status;
this.serviceAlarmAgree = serviceAlarmAgree;
this.marketingAgree = marketingAgree;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Term에 대한 부분 초창기에 이야기를 했던 부분인데요 Term이 하나 이상이기도 하고 분리하는게 좋아보입니다!

Term을 언제 동의 했는지 보통 기록한다고 하더라구요? 그럴려면 매핑 엔티티로 관리하고 거기서 update 시간을 기록할태니 ...
그 방향이 좋지 않나 생각합니다.


public static Member createMember(
Expand All @@ -72,11 +78,21 @@ public static Member createMember(
.profileImageUrl(profileImageUrl)
.role(MemberRole.USER)
.status(MemberStatus.NORMAL)
.serviceAlarmAgree(Boolean.FALSE)
.marketingAgree(Boolean.FALSE)
.build();
}

public void updateMember(String nickname, String profileImageUrl) {
this.nickname = nickname;
this.profileImageUrl = profileImageUrl;
}

public void toggleServiceAlarmAgree() {
serviceAlarmAgree = !serviceAlarmAgree;
}

public void toggleMarketingAgree() {
marketingAgree = !marketingAgree;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ 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_alarm_agree BOOLEAN NOT NULL,
marketing_agree BOOLEAN NOT NULL,
created_at DATETIME(6) NOT NULL,
updated_at DATETIME(6) NOT NULL
);
Expand Down