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
@@ -1,4 +1,4 @@
package org.cherrypic.domain.album.event;
package org.cherrypic.domain.album.dto.event;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cherrypic.domain.album.event;
package org.cherrypic.domain.album.dto.event;

public record AlbumImagesDeleteEvent(Long albumId) {
public static AlbumImagesDeleteEvent of(Long albumId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@
import org.cherrypic.album.entity.Album;
import org.cherrypic.album.entity.InvitationCode;
import org.cherrypic.album.enums.AlbumType;
import org.cherrypic.domain.album.dto.event.AlbumDeleteNotificationSendEvent;
import org.cherrypic.domain.album.dto.event.AlbumImagesDeleteEvent;
import org.cherrypic.domain.album.dto.request.AlbumCreateRequest;
import org.cherrypic.domain.album.dto.request.AlbumUpdateRequest;
import org.cherrypic.domain.album.dto.response.*;
import org.cherrypic.domain.album.event.AlbumDeleteNotificationSendEvent;
import org.cherrypic.domain.album.event.AlbumImagesDeleteEvent;
import org.cherrypic.domain.album.exception.AlbumErrorCode;
import org.cherrypic.domain.album.repository.AlbumRepository;
import org.cherrypic.domain.album.repository.InvitationCodeRepository;
import org.cherrypic.domain.event.repository.EventImageRepository;
import org.cherrypic.domain.event.repository.EventRepository;
import org.cherrypic.domain.favorites.repository.FavoritesRepository;
import org.cherrypic.domain.image.event.ImageDeleteEvent;
import org.cherrypic.domain.image.event.ImagesDeleteEvent;
import org.cherrypic.domain.image.dto.event.ImageDeleteEvent;
import org.cherrypic.domain.image.dto.event.ImagesDeleteEvent;
import org.cherrypic.domain.image.repository.ImageRepository;
import org.cherrypic.domain.notification.repository.NotificationRepository;
import org.cherrypic.domain.participant.repository.ParticipantRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import org.cherrypic.domain.event.exception.EventErrorCode;
import org.cherrypic.domain.event.repository.EventImageRepository;
import org.cherrypic.domain.event.repository.EventRepository;
import org.cherrypic.domain.image.event.ImageDeleteEvent;
import org.cherrypic.domain.image.dto.event.ImageDeleteEvent;
import org.cherrypic.domain.image.exception.ImageErrorCode;
import org.cherrypic.domain.image.repository.ImageRepository;
import org.cherrypic.domain.participant.repository.ParticipantRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cherrypic.domain.image.event;
package org.cherrypic.domain.image.dto.event;

public record ImageDeleteEvent(String imageUrl) {
public static ImageDeleteEvent of(String imageUrl) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cherrypic.domain.image.event;
package org.cherrypic.domain.image.dto.event;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package org.cherrypic.domain.image.event;

import lombok.RequiredArgsConstructor;
import org.cherrypic.domain.album.event.AlbumImagesDeleteEvent;
import org.cherrypic.domain.album.dto.event.AlbumImagesDeleteEvent;
import org.cherrypic.domain.image.dto.event.ImageDeleteEvent;
import org.cherrypic.domain.image.dto.event.ImagesDeleteEvent;
import org.cherrypic.s3.S3Util;
import org.cherrypic.s3.enums.ImageType;
import org.springframework.scheduling.annotation.Async;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@
import org.cherrypic.domain.event.exception.EventErrorCode;
import org.cherrypic.domain.event.repository.EventImageRepository;
import org.cherrypic.domain.event.repository.EventRepository;
import org.cherrypic.domain.image.dto.event.ImagesDeleteEvent;
import org.cherrypic.domain.image.dto.request.*;
import org.cherrypic.domain.image.dto.response.*;
import org.cherrypic.domain.image.event.ImagesDeleteEvent;
import org.cherrypic.domain.image.exception.ImageErrorCode;
import org.cherrypic.domain.image.repository.ImageRepository;
import org.cherrypic.domain.participant.repository.ParticipantRepository;
import org.cherrypic.domain.subscription.exception.SubscriptionErrorCode;
import org.cherrypic.domain.subscription.repository.SubscriptionRepository;
import org.cherrypic.domain.tempalbum.event.TempAlbumImagesDeleteEvent;
import org.cherrypic.domain.tempalbum.dto.event.TempAlbumImagesDeleteEvent;
import org.cherrypic.domain.tempalbum.exception.TempAlbumErrorCode;
import org.cherrypic.domain.tempalbum.repository.TempAlbumImageRepository;
import org.cherrypic.domain.tempalbum.repository.TempAlbumRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.cherrypic.domain.member.service;

import lombok.RequiredArgsConstructor;
import org.cherrypic.domain.image.event.ImageDeleteEvent;
import org.cherrypic.domain.image.dto.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;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.cherrypic.domain.notification.event;

import lombok.RequiredArgsConstructor;
import org.cherrypic.domain.album.event.AlbumDeleteNotificationSendEvent;
import org.cherrypic.domain.album.dto.event.AlbumDeleteNotificationSendEvent;
import org.cherrypic.domain.notification.service.NotificationService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,11 @@ public ResponseEntity<Void> tempAlbumUpdate(
tempAlbumService.updateTempAlbum(tempAlbumId, request);
return ResponseEntity.noContent().build();
}

@DeleteMapping("/{tempAlbumId}")
@Operation(summary = "임시 앨범 삭제", description = "임시 앨범을 삭제합니다.")
public ResponseEntity<Void> tempAlbumDelete(@PathVariable Long tempAlbumId) {
tempAlbumService.deleteTempAlbum(tempAlbumId);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.cherrypic.domain.tempalbum.dto.event;

import org.cherrypic.tempalbum.entity.TempAlbum;

public record TempAlbumDeleteEvent(Long tempAlbumId) {
public static TempAlbumDeleteEvent of(TempAlbum tempAlbum) {
return new TempAlbumDeleteEvent(tempAlbum.getId());
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cherrypic.domain.tempalbum.event;
package org.cherrypic.domain.tempalbum.dto.event;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package org.cherrypic.domain.tempalbum.event;

import lombok.RequiredArgsConstructor;
import org.cherrypic.domain.tempalbum.dto.event.TempAlbumDeleteEvent;
import org.cherrypic.domain.tempalbum.dto.event.TempAlbumImagesDeleteEvent;
import org.cherrypic.s3.S3Util;
import org.cherrypic.s3.enums.ImageType;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
Expand All @@ -18,4 +21,10 @@ public class TempAlbumEventListener {
public void handleTempAlbumImagesDeleteEvent(TempAlbumImagesDeleteEvent event) {
s3Util.deleteAllByUrls(event.tempImageUrls());
}

@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void handleTempAlbumDeleteEvent(TempAlbumDeleteEvent event) {
s3Util.deleteAllByImageTypeAndTargetId(ImageType.TEMP_ALBUM_IMAGE, event.tempAlbumId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,12 @@

import org.cherrypic.tempalbum.entity.TempAlbumImage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

public interface TempAlbumImageRepository extends JpaRepository<TempAlbumImage, Long> {}
public interface TempAlbumImageRepository extends JpaRepository<TempAlbumImage, Long> {

@Modifying(clearAutomatically = true)
@Query("delete from TempAlbumImage i where i.tempAlbum.id = :tempAlbumId")
void deleteAllByTempAlbumId(Long tempAlbumId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
import org.cherrypic.tempalbum.entity.TempAlbum;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface TempAlbumRepository extends JpaRepository<TempAlbum, Long> {

long countByMemberId(Long memberId);

@Query("SELECT t FROM TempAlbum t WHERE t.member.id = :memberId ORDER BY t.id DESC")
List<TempAlbum> findAllByMemberIdOrderByIdDesc(@Param("memberId") Long memberId);
@Query("select t from TempAlbum t where t.member.id = :memberId order by t.id desc")
List<TempAlbum> findAllByMemberIdOrderByIdDesc(Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,6 @@ public interface TempAlbumService {
void updateTempAlbum(Long tempAlbumId, TempAlbumUpdateRequest request);

TempAlbumInfoResponse getTempAlbum(Long tempAlbumId);

void deleteTempAlbum(Long tempAlbumId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,21 @@
import java.util.List;
import java.util.Objects;
import lombok.RequiredArgsConstructor;
import org.cherrypic.domain.tempalbum.dto.event.TempAlbumDeleteEvent;
import org.cherrypic.domain.tempalbum.dto.request.TempAlbumCreateRequest;
import org.cherrypic.domain.tempalbum.dto.request.TempAlbumUpdateRequest;
import org.cherrypic.domain.tempalbum.dto.response.TempAlbumCreateResponse;
import org.cherrypic.domain.tempalbum.dto.response.TempAlbumInfoResponse;
import org.cherrypic.domain.tempalbum.dto.response.TempAlbumListResponse;
import org.cherrypic.domain.tempalbum.exception.TempAlbumErrorCode;
import org.cherrypic.domain.tempalbum.repository.TempAlbumImageRepository;
import org.cherrypic.domain.tempalbum.repository.TempAlbumRepository;
import org.cherrypic.exception.CustomException;
import org.cherrypic.global.util.MemberUtil;
import org.cherrypic.member.entity.Member;
import org.cherrypic.s3.S3Util;
import org.cherrypic.tempalbum.entity.TempAlbum;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -23,8 +27,12 @@
public class TempAlbumServiceImpl implements TempAlbumService {

private final MemberUtil memberUtil;
private final S3Util s3Util;

private final TempAlbumRepository tempAlbumRepository;
private final TempAlbumImageRepository tempAlbumImageRepository;

private final ApplicationEventPublisher eventPublisher;

@Override
@Transactional
Expand Down Expand Up @@ -74,6 +82,19 @@ public TempAlbumInfoResponse getTempAlbum(Long tempAlbumId) {
tempAlbum.getWebUrl());
}

@Override
@Transactional
public void deleteTempAlbum(Long tempAlbumId) {
final Member currentMember = memberUtil.getCurrentMember();
final TempAlbum tempAlbum = getTempAlbumById(tempAlbumId);

validateTempAlbumOwner(tempAlbum, currentMember.getId());

eventPublisher.publishEvent(TempAlbumDeleteEvent.of(tempAlbum));
tempAlbumImageRepository.deleteAllByTempAlbumId(tempAlbum.getId());
tempAlbumRepository.delete(tempAlbum);
}

private void validateTempAlbumCreateLimit(Member member) {
long count = tempAlbumRepository.countByMemberId(member.getId());
if (count >= 5) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,22 @@
import org.cherrypic.album.entity.Album;
import org.cherrypic.album.entity.InvitationCode;
import org.cherrypic.album.enums.AlbumType;
import org.cherrypic.domain.album.dto.event.AlbumDeleteNotificationSendEvent;
import org.cherrypic.domain.album.dto.event.AlbumImagesDeleteEvent;
import org.cherrypic.domain.album.dto.request.AlbumCreateRequest;
import org.cherrypic.domain.album.dto.request.AlbumUpdateRequest;
import org.cherrypic.domain.album.dto.response.AlbumInfoResponse;
import org.cherrypic.domain.album.dto.response.AlbumListResponse;
import org.cherrypic.domain.album.dto.response.InvitationLinkCreateResponse;
import org.cherrypic.domain.album.event.AlbumDeleteNotificationSendEvent;
import org.cherrypic.domain.album.event.AlbumImagesDeleteEvent;
import org.cherrypic.domain.album.exception.AlbumErrorCode;
import org.cherrypic.domain.album.repository.AlbumRepository;
import org.cherrypic.domain.album.repository.InvitationCodeRepository;
import org.cherrypic.domain.album.service.AlbumService;
import org.cherrypic.domain.event.repository.EventImageRepository;
import org.cherrypic.domain.event.repository.EventRepository;
import org.cherrypic.domain.favorites.repository.FavoritesRepository;
import org.cherrypic.domain.image.event.ImageDeleteEvent;
import org.cherrypic.domain.image.event.ImagesDeleteEvent;
import org.cherrypic.domain.image.dto.event.ImageDeleteEvent;
import org.cherrypic.domain.image.dto.event.ImagesDeleteEvent;
import org.cherrypic.domain.image.repository.ImageRepository;
import org.cherrypic.domain.member.repository.MemberRepository;
import org.cherrypic.domain.notification.repository.NotificationRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import org.cherrypic.domain.event.repository.EventImageRepository;
import org.cherrypic.domain.event.repository.EventRepository;
import org.cherrypic.domain.event.service.EventService;
import org.cherrypic.domain.image.event.ImageDeleteEvent;
import org.cherrypic.domain.image.dto.event.ImageDeleteEvent;
import org.cherrypic.domain.image.exception.ImageErrorCode;
import org.cherrypic.domain.image.repository.ImageRepository;
import org.cherrypic.domain.member.repository.MemberRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@
import org.cherrypic.domain.event.exception.EventErrorCode;
import org.cherrypic.domain.event.repository.EventImageRepository;
import org.cherrypic.domain.event.repository.EventRepository;
import org.cherrypic.domain.image.dto.event.ImagesDeleteEvent;
import org.cherrypic.domain.image.dto.request.*;
import org.cherrypic.domain.image.dto.response.*;
import org.cherrypic.domain.image.event.ImagesDeleteEvent;
import org.cherrypic.domain.image.exception.ImageErrorCode;
import org.cherrypic.domain.image.repository.ImageRepository;
import org.cherrypic.domain.image.service.ImageService;
import org.cherrypic.domain.member.repository.MemberRepository;
import org.cherrypic.domain.participant.repository.ParticipantRepository;
import org.cherrypic.domain.subscription.repository.SubscriptionRepository;
import org.cherrypic.domain.tempalbum.event.TempAlbumImagesDeleteEvent;
import org.cherrypic.domain.tempalbum.dto.event.TempAlbumImagesDeleteEvent;
import org.cherrypic.domain.tempalbum.exception.TempAlbumErrorCode;
import org.cherrypic.domain.tempalbum.repository.TempAlbumImageRepository;
import org.cherrypic.domain.tempalbum.repository.TempAlbumRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import org.cherrypic.IntegrationTest;
import org.cherrypic.RedisCleaner;
import org.cherrypic.domain.image.event.ImageDeleteEvent;
import org.cherrypic.domain.image.dto.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.MemberInfoResponse;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,4 +304,51 @@ class 임시_앨범_개별_조회_요청_시 {
.andExpect(jsonPath("$.data.message").value("임시 앨범 소유자가 아닌 경우 권한이 없습니다."));
}
}

@Nested
class 임시_앨범_삭제_요청_시 {

@Test
void 유효한_요청이면_임시_앨범을_삭제한다() throws Exception {
// given
willDoNothing().given(tempAlbumService).deleteTempAlbum(1L);

// when & then
ResultActions perform = mockMvc.perform(delete("/temp-albums/1"));

perform.andExpect(status().isNoContent())
.andExpect(jsonPath("$.success").value(true))
.andExpect(jsonPath("$.status").value(HttpStatus.NO_CONTENT.value()));
}

@Test
void 임시_앨범이_존재하지_않는_경우_예외가_발생한다() throws Exception {
// given
willThrow(new CustomException(TempAlbumErrorCode.TEMP_ALBUM_NOT_FOUND))
.given(tempAlbumService)
.deleteTempAlbum(1L);

// when & then
ResultActions perform = mockMvc.perform(delete("/temp-albums/1"));

perform.andExpect(status().isNotFound())
.andExpect(jsonPath("$.success").value(false))
.andExpect(jsonPath("$.status").value(HttpStatus.NOT_FOUND.value()));
}

@Test
void 임시_앨범_소유자가_아닌_경우_예외가_발생한다() throws Exception {
// given
willThrow(new CustomException(TempAlbumErrorCode.NOT_TEMP_ALBUM_OWNER))
.given(tempAlbumService)
.deleteTempAlbum(1L);

// when & then
ResultActions perform = mockMvc.perform(delete("/temp-albums/1"));

perform.andExpect(status().isForbidden())
.andExpect(jsonPath("$.success").value(false))
.andExpect(jsonPath("$.status").value(HttpStatus.FORBIDDEN.value()));
}
}
}
Loading