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
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ dependencies {
implementation("com.sun.mail:javax.mail:1.6.2")

// test h2 db
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'com.h2database:h2'

}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package NextLevel.demo.img;

public class MustLastParameterException extends RuntimeException{
public MustLastParameterException(String message ){
super(message);
}
}
30 changes: 30 additions & 0 deletions src/main/java/NextLevel/demo/img/service/ImgPath.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package NextLevel.demo.img.service;

import lombok.Getter;
import lombok.Setter;

import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
public class ImgPath {

private List<Path> saved;
private List<Path> deleted;

public void save(Path path){
saved.add(path);
}

public void delete(Path path){
deleted.add(path);
}

public ImgPath(){
saved = new ArrayList<>();
deleted = new ArrayList<>();
}

}
6 changes: 3 additions & 3 deletions src/main/java/NextLevel/demo/img/service/ImgService.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@

public interface ImgService {

ImgEntity saveImg(MultipartFile imgFile, ArrayList<Path> imgPaths);
ImgEntity updateImg(MultipartFile imgFile, ImgEntity oldImg, ArrayList<Path> imgPaths);
void deleteImg(ImgEntity img);
ImgEntity saveImg(MultipartFile imgFile, ImgPath imgPath);
ImgEntity updateImg(MultipartFile imgFile, ImgEntity oldImg, ImgPath imgPath);
void deleteImg(ImgEntity img, ImgPath imgPath);
ImgEntity saveSocialImg(String imgURL);
void deleteImgFile(List<Path> filePath) throws IOException ;

Expand Down
32 changes: 16 additions & 16 deletions src/main/java/NextLevel/demo/img/service/ImgServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,18 @@ public class ImgServiceImpl implements ImgService {
private final ImgRepository imgRepository;

// @Transactional(propagation = Propagation.REQUIRES_NEW)
public ImgEntity saveImg(MultipartFile imgFile, ArrayList<Path> imgPaths) {
public ImgEntity saveImg(MultipartFile imgFile, ImgPath imgPath) {
if(imgFile == null || imgFile.isEmpty()) return null;
try {
byte[] bytes = imgFile.getBytes();
String fileName = imgFile.getOriginalFilename();

fileName = addImgNumber(fileName);

Path path = Paths.get(System.getProperty("user.dir") ,IMG_DEFAULT_PATH, fileName);
Path path = getPath(fileName); // Paths.get(System.getProperty("user.dir") ,IMG_DEFAULT_PATH, fileName);

Files.write(path, bytes);
imgPaths.add(path);
imgPath.save(path);

ImgEntity saved = imgRepository.save(new ImgEntity(fileName));

Expand All @@ -61,13 +61,13 @@ public ImgEntity saveImg(MultipartFile imgFile, ArrayList<Path> imgPaths) {
}

// img uri 변경 없이 진짜 파일 값만 덮어쓰기
public ImgEntity updateImg(MultipartFile imgFile, ImgEntity oldImg, ArrayList<Path> imgPaths) {
public ImgEntity updateImg(MultipartFile imgFile, ImgEntity oldImg, ImgPath imgPath) {
if(oldImg == null){
return saveImg(imgFile, imgPaths);
return saveImg(imgFile, imgPath);
}

try {
Path path = Paths.get(System.getProperty("user.dir"), IMG_DEFAULT_PATH, oldImg.getUri());
Path path = getPath(oldImg.getUri()); // Paths.get(System.getProperty("user.dir"), IMG_DEFAULT_PATH, oldImg.getUri());

Files.write(path, imgFile.getBytes());

Expand All @@ -84,18 +84,14 @@ public ImgEntity updateImg(MultipartFile imgFile, ImgEntity oldImg, ArrayList<Pa
}

// @Transactional
public void deleteImg(ImgEntity img) {
public void deleteImg(ImgEntity img, ImgPath imgPath) {
if(img == null)
return;

try {
Files.deleteIfExists(Paths.get(System.getProperty("user.dir") ,IMG_DEFAULT_PATH, img.getUri()));
imgRepository.deleteById(img.getId());
log.info("deleted image id : " + img.getId());
} catch (IOException e) {
log.info(e.getMessage());
throw new CustomException(ErrorCode.ERROR_ON_DELETE_IMG);
}

// Files.deleteIfExists();
imgPath.delete(getPath(img.getUri()));
imgRepository.deleteById(img.getId());
log.info("deleted image id : " + img.getId());
}

public ImgEntity saveSocialImg(String imgURL) {
Expand Down Expand Up @@ -157,4 +153,8 @@ public void deleteImgFile(List<Path> filePath) throws IOException {
Files.deleteIfExists(path);
}
}

private Path getPath(String uri) {
return Paths.get(System.getProperty("user.dir") ,IMG_DEFAULT_PATH, uri);
}
}
24 changes: 20 additions & 4 deletions src/main/java/NextLevel/demo/img/service/ImgTransactionAop.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import java.nio.file.Path;
import java.util.ArrayList;

import NextLevel.demo.img.MustLastParameterException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
Expand All @@ -16,17 +18,31 @@
public class ImgTransactionAop {
private final ImgServiceImpl imgService;

/*
joinPoint :: args :: last argument is must ImgPath.class
success : delete all deleted Img File
fail : delete add saved Img File
*/

@Around("@annotation(imgTransaction)")
public Object around(ProceedingJoinPoint joinPoint, ImgTransaction imgTransaction) throws Throwable {
ArrayList<Path> imgPaths = new ArrayList<>();
ImgPath path = new ImgPath();
log.info("img transaction start");
try{
Object[] args = joinPoint.getArgs();
args[args.length-1] = imgPaths;
return joinPoint.proceed(args);
Object lastParameter = args[args.length-1];

if(!(lastParameter instanceof ImgPath))
throw new MustLastParameterException("last parameter must be of type ImgPath.class");

args[args.length-1] = path;

Object result = joinPoint.proceed(args);
imgService.deleteImgFile(path.getDeleted());
return result;
} catch (Exception e){
log.info("img transaction :: error :: roll back all img files");
imgService.deleteImgFile(imgPaths);
imgService.deleteImgFile(path.getSaved());
throw e;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package NextLevel.demo.notice.controller;

import NextLevel.demo.common.SuccessResponse;
import NextLevel.demo.img.service.ImgTransaction;
import NextLevel.demo.notice.dto.ResponseNoticeDto;
import NextLevel.demo.notice.dto.SaveNoticeDto;
import NextLevel.demo.notice.entity.NoticeEntity;
Expand Down Expand Up @@ -52,8 +53,9 @@ public ResponseEntity<?> updateNotice(@ModelAttribute SaveNoticeDto dto, @PathVa
}

@PostMapping("/admin/notice/{id}")
@ImgTransaction
public ResponseEntity<?> removeNotice(@PathVariable("id") Long id) {
noticeService.removeNotice(id);
noticeService.removeNotice(id, null);
return ResponseEntity.ok(new SuccessResponse("success", null));
}
}
15 changes: 8 additions & 7 deletions src/main/java/NextLevel/demo/notice/service/NoticeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import NextLevel.demo.exception.CustomException;
import NextLevel.demo.exception.ErrorCode;
import NextLevel.demo.img.entity.ImgEntity;
import NextLevel.demo.img.service.ImgPath;
import NextLevel.demo.img.service.ImgService;
import NextLevel.demo.img.service.ImgTransaction;
import NextLevel.demo.notice.dto.SaveNoticeDto;
Expand Down Expand Up @@ -34,13 +35,13 @@ public List<NoticeEntity> getAllNotice() {

@ImgTransaction
@Transactional
public void addNotice(SaveNoticeDto dto, ArrayList<Path> imgPaths) {
public void addNotice(SaveNoticeDto dto, ImgPath imgPath) {
NoticeEntity newNotice = dto.toEntity();
List<ImgEntity> newImgs = new ArrayList<ImgEntity>();
if(dto.getImgs()!=null && !dto.getImgs().isEmpty()) {
dto.getImgs().stream().forEach(file -> {
if(file != null && !file.isEmpty())
newImgs.add(imgService.saveImg(file, imgPaths));
newImgs.add(imgService.saveImg(file, imgPath));
});
newNotice.setImgs(
newImgs
Expand Down Expand Up @@ -76,15 +77,15 @@ public void updateNotice(SaveNoticeDto dto) {

@ImgTransaction
@Transactional
public void updateImg(Long noticeId, List<MultipartFile> imgFiles, ArrayList<Path> imgPaths) {
public void updateImg(Long noticeId, List<MultipartFile> imgFiles, ImgPath imgPath) {
NoticeEntity notice = noticeRepository.findById(noticeId).orElseThrow(
() -> {throw new CustomException(ErrorCode.NOT_FOUND, "notice");}
);
List<NoticeImgEntity> oldNoticeImgs = notice.getImgs();
List<ImgEntity> oldImgs = oldNoticeImgs.stream().map(NoticeImgEntity::getImg).toList();

List<ImgEntity> newImgs = new ArrayList<>();
imgFiles.stream().forEach(i->newImgs.add(imgService.saveImg(i, imgPaths)));
imgFiles.stream().forEach(i->newImgs.add(imgService.saveImg(i, imgPath)));
List<NoticeImgEntity> newNoticeImgs = new ArrayList<>();
newImgs
.stream()
Expand All @@ -100,18 +101,18 @@ public void updateImg(Long noticeId, List<MultipartFile> imgFiles, ArrayList<Pat

noticeImgRepository.saveAll(newNoticeImgs);
noticeImgRepository.deleteAllById(oldNoticeImgs.stream().map(NoticeImgEntity::getId).toList());
oldImgs.stream().forEach(imgService::deleteImg);
oldImgs.stream().forEach((img)->imgService.deleteImg(img, imgPath));
}

//@Transactional
public void removeNotice(Long noticeId) {
public void removeNotice(Long noticeId, ImgPath imgPath) {
NoticeEntity notice = noticeRepository.findById(noticeId).orElseThrow(
() -> {throw new CustomException(ErrorCode.NOT_FOUND, "notice");}
);
List<ImgEntity> oldImgs = notice.getImgs().stream().map(NoticeImgEntity::getImg).toList();

noticeRepository.delete(notice);

oldImgs.forEach(imgService::deleteImg);
oldImgs.forEach((img)->imgService.deleteImg(img, imgPath));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import NextLevel.demo.exception.CustomException;
import NextLevel.demo.exception.ErrorCode;
import NextLevel.demo.img.entity.ImgEntity;
import NextLevel.demo.img.service.ImgPath;
import NextLevel.demo.img.service.ImgServiceImpl;
import NextLevel.demo.img.service.ImgTransaction;
import NextLevel.demo.project.notice.dto.request.SaveProjectNoticeRequestDto;
Expand Down Expand Up @@ -36,20 +37,20 @@ public List<ProjectNoticeEntity> getAllNotice(Long projectId){

@Transactional
@ImgTransaction
public void saveProjectNotice(SaveProjectNoticeRequestDto dto, ArrayList<Path> imgPaths) {
public void saveProjectNotice(SaveProjectNoticeRequestDto dto, ImgPath imgPath) {
ProjectEntity project = projectValidateService.getProjectEntity(dto.getProjectId());

if(!project.getUser().getId().equals(dto.getUserId()))
throw new CustomException(ErrorCode.NOT_AUTHOR);

ImgEntity savedImg = imgService.saveImg(dto.getImg(), imgPaths);
ImgEntity savedImg = imgService.saveImg(dto.getImg(), imgPath);

projectNoticeRepository.save(dto.toEntity(savedImg, project));
}

@Transactional
@ImgTransaction
public void updateNotice(SaveProjectNoticeRequestDto dto, ArrayList<Path> imgPaths) {
public void updateNotice(SaveProjectNoticeRequestDto dto, ImgPath imgPath) {
ProjectNoticeEntity notice = projectNoticeRepository.findByIdWithProject(dto.getNoticeId()).orElseThrow(
()->{return new CustomException(ErrorCode.NOT_FOUND, "notice");}
);
Expand All @@ -60,7 +61,7 @@ public void updateNotice(SaveProjectNoticeRequestDto dto, ArrayList<Path> imgPa
notice.update(dto);

if(dto.getImg() != null && !dto.getImg().isEmpty()) {
ImgEntity savedImg = imgService.updateImg(dto.getImg(), notice.getImg(), imgPaths);
ImgEntity savedImg = imgService.updateImg(dto.getImg(), notice.getImg(), imgPath);
if(notice.getImg() == null)
notice.setImg(savedImg);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import NextLevel.demo.funding.service.FundingRollbackService;
import NextLevel.demo.funding.service.FundingValidateService;
import NextLevel.demo.img.entity.ImgEntity;
import NextLevel.demo.img.service.ImgPath;
import NextLevel.demo.img.service.ImgServiceImpl;
import NextLevel.demo.img.service.ImgTransaction;
import NextLevel.demo.project.project.dto.request.CreateProjectDto;
Expand Down Expand Up @@ -53,18 +54,18 @@ public class ProjectService {
// 추가
@ImgTransaction
@Transactional
public void save(CreateProjectDto dto, ArrayList<Path> imgPaths) {
public void save(CreateProjectDto dto, ImgPath imgPath) {
// user 처리
UserEntity user = userValidateService.getUserInfoWithAccessToken(dto.getUserId());
validateUser(user);

if(dto.getTitleImg() == null || dto.getTitleImg().isEmpty())
throw new CustomException(ErrorCode.INPUT_REQUIRED_PARAMETER);
ImgEntity img = imgService.saveImg(dto.getTitleImg(), imgPaths);
ImgEntity img = imgService.saveImg(dto.getTitleImg(), imgPath);

ProjectEntity newProject = projectRepository.save(dto.toProjectEntity(user, img));

projectStoryService.saveNewProjectStory(newProject, dto.getImgs(), imgPaths);
projectStoryService.saveNewProjectStory(newProject, dto.getImgs(), imgPath);
tagService.saveNewTags(newProject, dto.getTags());
}
private void validateUser(UserEntity user) {
Expand All @@ -75,7 +76,7 @@ private void validateUser(UserEntity user) {
// 수정
@ImgTransaction
@Transactional
public void update(CreateProjectDto dto, ArrayList<Path> imgPaths) {
public void update(CreateProjectDto dto, ImgPath imgPath) {
Optional<ProjectEntity> oldProjectOptional = projectRepository.findByIdWithAll(dto.getId());

if(oldProjectOptional.isEmpty())
Expand All @@ -88,19 +89,39 @@ public void update(CreateProjectDto dto, ArrayList<Path> imgPaths) {

ImgEntity img = oldProject.getTitleImg();
if(dto.getTitleImg() != null)
img = imgService.updateImg(dto.getTitleImg(), oldProject.getTitleImg(), imgPaths);
img = imgService.updateImg(dto.getTitleImg(), oldProject.getTitleImg(), imgPath);

// tag 처리
if(dto.getTags() != null && !dto.getTags().isEmpty())
tagService.updateTags(oldProject, dto.getTags());

// img 처리
if(dto.getImgs() != null && !dto.getImgs().isEmpty())
projectStoryService.updateProjectStory(oldProject, dto.getImgs(), imgPaths);
projectStoryService.updateProjectStory(oldProject, dto.getImgs(), imgPath);

projectRepository.save(dto.toProjectEntity(oldProject.getUser(), img)); // 값이 있는 것만 update 형식으로 수정 필요
}

// 삭제
@Transactional
@ImgTransaction
public void deleteProject(Long id, ImgPath imgPath) {
Optional<ProjectEntity> oldProjectOptional = projectRepository.findById(id);
if(oldProjectOptional.isEmpty())
throw new CustomException(ErrorCode.NOT_FOUND, "project");
ProjectEntity oldProject = oldProjectOptional.get();

// 펀딩 금액이 남아있다면 모두 환불 처리하기
fundingRollbackService.rollbackByProject(oldProject);

// 다른 soft적 처리 필요한 부분 처리하기

// img 처리
projectStoryService.updateProjectStory(oldProject, new ArrayList<>(), imgPath);

return; // 아직 구현하지 않음 + soft delete 처리 고민중 .....
}

// get list
public ResponseProjectListDto getAllProjects(RequestMainPageProjectListDto dto) {
return projectDslRepository.selectProjectDsl(dto);
Expand Down
Loading
Loading