Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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 @@ -16,6 +16,7 @@
import org.cherrypic.domain.event.repository.EventRepository;
import org.cherrypic.domain.image.event.ImageDeleteEvent;
import org.cherrypic.domain.image.event.ImagesDeleteEvent;
import org.cherrypic.domain.image.repository.ImageRepository;
import org.cherrypic.domain.participant.repository.ParticipantRepository;
import org.cherrypic.domain.payment.exception.PaymentErrorCode;
import org.cherrypic.domain.payment.repository.PaymentRepository;
Expand Down Expand Up @@ -51,6 +52,7 @@ public class AlbumServiceImpl implements AlbumService {
private final SubscriptionRepository subscriptionRepository;
private final InvitationCodeRepository invitationCodeRepository;
private final EventRepository eventRepository;
private final ImageRepository imageRepository;

private final ApplicationEventPublisher eventPublisher;

Expand Down Expand Up @@ -222,7 +224,10 @@ public void deleteAlbum(Long albumId) {
eventPublisher.publishEvent(
ImagesDeleteEvent.of(events.stream().map(Event::getCoverUrl).toList()));

eventPublisher.publishEvent(AlbumImagesDeleteEvent.of(album.getId()));
if (imageRepository.existsByAlbumId(album.getId())) {
eventPublisher.publishEvent(AlbumImagesDeleteEvent.of(album.getId()));
}

if (album.getCoverUrl() != null) {
eventPublisher.publishEvent(ImageDeleteEvent.of(album.getCoverUrl()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
import java.util.List;

public record ImageUploadListResponse(
@Schema(description = "로컬 사진 삭제 허용 여부") Boolean localImageDeletion,
@Schema(description = "업로드된 이미지들의 정보 리스트") List<Payload> payloads) {
public static ImageUploadListResponse of(List<Payload> payloads) {
return new ImageUploadListResponse(payloads);
public static ImageUploadListResponse of(List<Payload> payloads, Boolean localImageDeletion) {
return new ImageUploadListResponse(localImageDeletion, payloads);
}

public record Payload(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@ public interface ImageRepository extends JpaRepository<Image, Long>, ImageReposi

long countByIdIn(List<Long> ids);

boolean existsByAlbumId(Long albumId);

long countByIdInAndAlbumId(List<Long> imageIds, Long albumId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ public ImageUploadListResponse createAlbumImageUploadUrls(
imageIds.get(i), presignedUrls.get(i)))
.toList();

return ImageUploadListResponse.of(payloads);
return ImageUploadListResponse.of(payloads, currentMember.getLocalImageDeletion());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
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.LocalImageDeletionToggleResponse;
import org.cherrypic.domain.member.dto.response.MemberInfoResponse;
import org.cherrypic.domain.member.dto.response.MemberProfileUpdateResponse;
import org.cherrypic.domain.member.service.MemberService;
Expand Down Expand Up @@ -33,6 +34,12 @@ public MemberProfileUpdateResponse memberProfileUpdate(
return memberService.updateProfile(request);
}

@PatchMapping("/me/local-image-deletion")
@Operation(summary = "로컬 이미지 삭제 허용 변경", description = "로컬 이미지 삭제 허용 여부를 변경합니다.")
public LocalImageDeletionToggleResponse localImageDeletionToggle() {
return memberService.toggleLocalImageDeletion();
}

@PostMapping("/fcm-tokens")
@Operation(
summary = "FCM 토큰 저장",
Expand Down
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 LocalImageDeletionToggleResponse(
@Schema(description = "로컬 이미지 삭제 허용 여부", example = "true") Boolean localImageDeletion) {
public static LocalImageDeletionToggleResponse from(Member member) {
return new LocalImageDeletionToggleResponse(member.getLocalImageDeletion());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,16 @@ 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 = "true") Boolean localImageDeletion) {
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.getLocalImageDeletion());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.cherrypic.domain.member.dto.request.FcmTokenSaveRequest;
import org.cherrypic.domain.member.dto.request.MemberProfileUpdateRequest;
import org.cherrypic.domain.member.dto.response.LocalImageDeletionToggleResponse;
import org.cherrypic.domain.member.dto.response.MemberInfoResponse;
import org.cherrypic.domain.member.dto.response.MemberProfileUpdateResponse;

Expand All @@ -11,4 +12,6 @@ public interface MemberService {
MemberProfileUpdateResponse updateProfile(MemberProfileUpdateRequest request);

void saveFcmToken(FcmTokenSaveRequest request);

LocalImageDeletionToggleResponse toggleLocalImageDeletion();
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
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.LocalImageDeletionToggleResponse;
import org.cherrypic.domain.member.dto.response.MemberInfoResponse;
import org.cherrypic.domain.member.dto.response.MemberProfileUpdateResponse;
import org.cherrypic.domain.notification.service.FcmTokenService;
Expand Down Expand Up @@ -50,4 +51,11 @@ public void saveFcmToken(FcmTokenSaveRequest request) {
final Member currentMember = memberUtil.getCurrentMember();
fcmTokenService.saveFcmToken(currentMember.getId(), request.fcmToken());
}

@Override
public LocalImageDeletionToggleResponse toggleLocalImageDeletion() {
final Member currentMember = memberUtil.getCurrentMember();
currentMember.toggleLocalImageDeletion();
return LocalImageDeletionToggleResponse.from(currentMember);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,7 @@ class 앨범_이미지_업로드_Presigned_URL을_생성_요청_시 {

ImageUploadListResponse response =
new ImageUploadListResponse(
false,
List.of(
new ImageUploadListResponse.Payload(1L, "testPresignedUrl1"),
new ImageUploadListResponse.Payload(2L, "testPresignedUrl2")));
Expand All @@ -371,7 +372,8 @@ class 앨범_이미지_업로드_Presigned_URL을_생성_요청_시 {
perform.andExpect(status().isOk())
.andExpect(jsonPath("$.success").value(true))
.andExpect(jsonPath("$.status").value(HttpStatus.OK.value()))
.andExpect(jsonPath("$.data.payloads").isNotEmpty());
.andExpect(jsonPath("$.data.payloads").isNotEmpty())
.andExpect(jsonPath("$.data.localImageDeletion").value(false));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,7 @@ void setUp() {
.containsPattern(
".*/local/album-image/1/[\\w\\-]+\\.(jpg|jpeg)\\?.+");
});
assertThat(response.localImageDeletion()).isFalse();

List<Image> images = imageRepository.findAll();
assertThat(images)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
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.LocalImageDeletionToggleResponse;
import org.cherrypic.domain.member.dto.response.MemberInfoResponse;
import org.cherrypic.domain.member.dto.response.MemberProfileUpdateResponse;
import org.cherrypic.domain.member.service.MemberService;
Expand Down Expand Up @@ -51,7 +52,8 @@ class 회원_정보_조회_요청_시 {
"testNickname",
"testProfileImageUrl",
MemberStatus.NORMAL,
MemberRole.USER);
MemberRole.USER,
false);

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

Expand All @@ -66,7 +68,8 @@ 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.localImageDeletion").value(false));
}
}

Expand Down Expand Up @@ -202,4 +205,27 @@ class FCM_토큰_저장_요청_시 {
.andExpect(jsonPath("$.data.message").value("FCM Token은 비워둘 수 없습니다."));
}
}

@Nested
class 로컬_이미지_삭제_허용_여부_변경_요청_시 {

@Test
void 유효한_요청이면_로컬_이미지_삭제_허용_여부를_변경한다() throws Exception {
// given
LocalImageDeletionToggleResponse response = new LocalImageDeletionToggleResponse(true);

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

// when & then
ResultActions perform =
mockMvc.perform(
patch("/members/me/local-image-deletion")
.contentType(MediaType.APPLICATION_JSON));

perform.andExpect(status().isOk())
.andExpect(jsonPath("$.success").value(true))
.andExpect(jsonPath("$.status").value(200))
.andExpect(jsonPath("$.data.localImageDeletion").value(true));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,16 @@ class 회원_정보를_조회할_때 {
"nickname",
"profileImageUrl",
"role",
"status")
"status",
"localImageDeletion")
.containsExactly(
1L,
"testOauthProvider",
"testNickname",
"testProfileImageUrl",
MemberRole.USER,
MemberStatus.NORMAL);
MemberStatus.NORMAL,
false);
}
}

Expand Down Expand Up @@ -155,4 +157,18 @@ void cleanUp() {
assertThat(redisTemplate.opsForSet().size(("fcmToken:1"))).isEqualTo(2);
}
}

@Nested
class 로컬_이미지_삭제_허용_여부를_변경할_때 {

@Test
void 유효한_요청이면_로컬_이미지_삭제_허용_여부를_변경한다() {
// when
memberService.toggleLocalImageDeletion();

// then
Member member = memberRepository.findById(1L).orElseThrow();
assertThat(member.getLocalImageDeletion()).isTrue();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ public class Member extends BaseTimeEntity {

@NotNull private Boolean appAlarm = Boolean.FALSE;

@NotNull private Boolean localImageDeletion;

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Payment> payments = new ArrayList<>();

Expand All @@ -56,12 +58,14 @@ private Member(
String nickname,
String profileImageUrl,
MemberRole role,
MemberStatus status) {
MemberStatus status,
Boolean localImageDeletion) {
this.oauthInfo = oauthInfo;
this.nickname = nickname;
this.profileImageUrl = profileImageUrl;
this.role = role;
this.status = status;
this.localImageDeletion = localImageDeletion;
}

public static Member createMember(
Expand All @@ -72,11 +76,16 @@ public static Member createMember(
.profileImageUrl(profileImageUrl)
.role(MemberRole.USER)
.status(MemberStatus.NORMAL)
.localImageDeletion(Boolean.FALSE)
.build();
}

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

public void toggleLocalImageDeletion() {
localImageDeletion = !localImageDeletion;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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')),
app_alarm BOOLEAN NOT NULL,
local_image_deletion BOOLEAN NOT NULL,
created_at DATETIME(6) NOT NULL,
updated_at DATETIME(6) NOT NULL
);
Expand Down