Skip to content

리소스 삭제 시 관련 이미지 파일도 삭제되도록 구현 #711

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Nov 19, 2024
Merged
9 changes: 9 additions & 0 deletions src/main/java/balancetalk/file/domain/FileHandler.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package balancetalk.file.domain;

import balancetalk.file.domain.repository.FileRepository;
import io.awspring.cloud.s3.S3Operations;
import java.util.List;
import lombok.RequiredArgsConstructor;
Expand All @@ -14,6 +15,7 @@ public class FileHandler {

private final S3Client s3Client;
private final S3Operations s3Operations;
private final FileRepository fileRepository;

@Value("${spring.cloud.aws.s3.bucket}")
private String bucket;
Expand Down Expand Up @@ -57,4 +59,11 @@ private void updateFile(File file, String s3Key, Long resourceId, FileType fileT
file.updateResourceId(resourceId);
file.updateFileType(fileType);
}

public void deleteFiles(List<File> files) {
for (File file : files) {
s3Operations.deleteObject(bucket, file.getS3Key());
}
fileRepository.deleteAll(files);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package balancetalk.file.domain.repository;

import balancetalk.file.domain.File;
import balancetalk.file.domain.FileType;
import java.util.List;

Expand All @@ -8,4 +9,8 @@ public interface FileRepositoryCustom {
List<String> findImgUrlsByResourceIdAndFileType(Long resourceId, FileType fileType);

List<Long> findIdsByResourceIdAndFileType(Long resourceId, FileType fileType);

List<File> findAllByResourceIdAndFileType(Long resourceId, FileType fileType);

List<File> findAllByResourceIdsAndFileType(List<Long> resourceIds, FileType fileType);
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,20 @@ public List<Long> findIdsByResourceIdAndFileType(Long resourceId, FileType fileT
.where(file.fileType.eq(fileType), file.resourceId.eq(resourceId))
.fetch();
}

@Override
public List<File> findAllByResourceIdAndFileType(Long resourceId, FileType fileType) {
return queryFactory.select(file)
.from(file)
.where(file.fileType.eq(fileType), file.resourceId.eq(resourceId))
.fetch();
}

@Override
public List<File> findAllByResourceIdsAndFileType(List<Long> resourceIds, FileType fileType) {
return queryFactory.select(file)
.from(file)
.where(file.fileType.eq(fileType), file.resourceId.in(resourceIds))
.fetch();
}
Copy link
Contributor

Choose a reason for hiding this comment

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

👍

}
21 changes: 17 additions & 4 deletions src/main/java/balancetalk/game/application/GameService.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package balancetalk.game.application;

import static balancetalk.file.domain.FileType.GAME_OPTION;

import balancetalk.bookmark.domain.GameBookmark;
import balancetalk.file.domain.File;
import balancetalk.file.domain.FileHandler;
import balancetalk.file.domain.FileType;
import balancetalk.file.domain.repository.FileRepository;
import balancetalk.game.domain.Game;
import balancetalk.game.domain.GameOption;
Expand Down Expand Up @@ -109,7 +111,7 @@ private void processFiles(List<CreateOrUpdateGame> gameRequests, List<Game> game
fileRepository.findById(gameOptionDto.getFileId())
.ifPresent(
file -> fileHandler.relocateFiles(Collections.singletonList(file), gameOption.getId(),
FileType.GAME_OPTION));
GAME_OPTION));

}
}
Expand Down Expand Up @@ -158,8 +160,19 @@ public boolean isBookmarkedActiveForGame(GameBookmark gameBookmark, Game game) {
}

public void deleteBalanceGameSet(final Long gameSetId, final ApiMember apiMember) {
apiMember.toMember(memberRepository);
gameSetRepository.deleteById(gameSetId);
Member member = apiMember.toMember(memberRepository);
GameSet gameSet = member.getGameSetById(gameSetId);
gameSetRepository.delete(gameSet);
List<Long> gameOptionIds = gameSet.getGameOptionIds();
deleteFiles(gameOptionIds);
}

private void deleteFiles(List<Long> gameOptionIds) {
List<File> files = fileRepository.findAllByResourceIdsAndFileType(gameOptionIds, GAME_OPTION);
if (files.isEmpty()) {
return;
}
fileHandler.deleteFiles(files);
}

public List<GameSetResponse> findLatestGames(final String tagName) {
Expand Down
22 changes: 19 additions & 3 deletions src/main/java/balancetalk/game/domain/Game.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,26 @@
import balancetalk.global.exception.BalanceTalkException;
import balancetalk.global.exception.ErrorCode;
import balancetalk.vote.domain.VoteOption;
import jakarta.persistence.*;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import java.util.stream.IntStream;
import lombok.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
Expand Down Expand Up @@ -60,4 +72,8 @@ public void updateGame(Game newGame) {
currentOption.updateGameOption(newOption);
});
}

public List<Long> getGameOptionIds() {
return gameOptions.stream().map(GameOption::getId).toList();
}
}
6 changes: 5 additions & 1 deletion src/main/java/balancetalk/game/domain/GameSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public class GameSet extends BaseTimeEntity {
@NotBlank
@Size(max = 50)
private String title;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
Expand Down Expand Up @@ -136,4 +136,8 @@ public String getFirstGameOptionImgA() {
public String getFirstGameOptionImgB() {
return games.get(0).getGameOptions().get(1).getImgUrl();
}

public List<Long> getGameOptionIds() {
return games.stream().flatMap(game -> game.getGameOptionIds().stream()).toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -98,5 +98,14 @@ public void deleteTalkPick(Long talkPickId, ApiMember apiMember) {
Member member = apiMember.toMember(memberRepository);
TalkPick talkPick = member.getTalkPickById(talkPickId);
talkPickRepository.delete(talkPick);
deleteFiles(talkPickId);
}

private void deleteFiles(Long talkPickId) {
List<File> files = fileRepository.findAllByResourceIdAndFileType(talkPickId, TALK_PICK);
if (files.isEmpty()) {
return;
}
fileHandler.deleteFiles(files);
}
}