diff --git a/src/main/java/muit/backend/apiPayLoad/code/status/ErrorStatus.java b/src/main/java/muit/backend/apiPayLoad/code/status/ErrorStatus.java index c04fb5c..2603134 100644 --- a/src/main/java/muit/backend/apiPayLoad/code/status/ErrorStatus.java +++ b/src/main/java/muit/backend/apiPayLoad/code/status/ErrorStatus.java @@ -42,6 +42,7 @@ public enum ErrorStatus implements BaseErrorCode { MEMBER_TICKET_ALREADY_CANCELED(HttpStatus.BAD_REQUEST, "MEMBERTICKET4003", "이미 취소하신 티켓입니다."), //POST ERROR POST_NOT_FOUND(HttpStatus.NOT_FOUND, "POST4000", "존재하지 않는 게시글입니다."), + IMAGE_NOT_FOUND(HttpStatus.NOT_FOUND, "IMAGE4000", "이미지를 찾을 수 없습니다."), //REPORT ERROR UNSUPPORTED_OBJECT_TYPE(HttpStatus.BAD_REQUEST, "REPORT4000", "지원하지 않는 신고 타입입니다."), diff --git a/src/main/java/muit/backend/controller/postController/CommonPostController.java b/src/main/java/muit/backend/controller/postController/CommonPostController.java index dba1da4..8122b49 100644 --- a/src/main/java/muit/backend/controller/postController/CommonPostController.java +++ b/src/main/java/muit/backend/controller/postController/CommonPostController.java @@ -16,6 +16,8 @@ import muit.backend.domain.enums.PostType; import muit.backend.domain.enums.ReportObjectType; import muit.backend.domain.enums.Role; +import muit.backend.dto.postDTO.PatchPostRequestDTO; +import muit.backend.dto.postDTO.PostRequestDTO; import muit.backend.dto.postDTO.PostResponseDTO; import muit.backend.dto.reportDTO.ReportRequestDTO; import muit.backend.dto.reportDTO.ReportResponseDTO; @@ -28,8 +30,10 @@ import muit.backend.service.postService.PostService; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.http.MediaType; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.List; @@ -155,4 +159,14 @@ public ApiResponse myPost(@RequestHeader("A return ApiResponse.onSuccess(list); } + @PatchMapping(value = "/{postId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation(summary = "게시글 수정 API", description = "특정 게시글을 수정하는 API 입니다.") + public ApiResponse editPost(@RequestHeader("Authorization") String accessToken, + @PathVariable("postId") Long postId, + @RequestPart("postRequestDTO") PatchPostRequestDTO postRequestDTO, + @RequestPart(name = "imageFiles", required = false)List img) { + Member member = memberService.getMemberByToken(accessToken); + return ApiResponse.onSuccess(postService.editPost(postId, postRequestDTO, img, member)); + } + } diff --git a/src/main/java/muit/backend/controller/postController/LostController.java b/src/main/java/muit/backend/controller/postController/LostController.java index e3f7d63..0c10ded 100644 --- a/src/main/java/muit/backend/controller/postController/LostController.java +++ b/src/main/java/muit/backend/controller/postController/LostController.java @@ -92,16 +92,4 @@ public ApiResponse getPost(@RequestHeade return ApiResponse.onSuccess(lostService.getLostPost(postId,member)); } - - @PatchMapping(value = "/{postId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - @Operation(summary = "분실 게시글 수정 API", description = "분실 게시글을 수정하는 API 입니다.") - public ApiResponse editPost(@RequestHeader("Authorization") String accessToken, - @PathVariable("postId") Long postId, - @RequestPart("lostRequestDTO") LostRequestDTO lostRequestDTO, - @RequestPart(name = "imageFiles", required = false)List img) { - - Member member = memberService.getMemberByToken(accessToken); - return ApiResponse.onSuccess(lostService.editLostPost(postId, lostRequestDTO, img, member)); - } - } diff --git a/src/main/java/muit/backend/controller/postController/PostController.java b/src/main/java/muit/backend/controller/postController/PostController.java index 9a8b84f..ebb98af 100644 --- a/src/main/java/muit/backend/controller/postController/PostController.java +++ b/src/main/java/muit/backend/controller/postController/PostController.java @@ -70,15 +70,4 @@ public ApiResponse getPost(@RequestHeade return ApiResponse.onSuccess(postService.getPost(postId, member)); } - - @PatchMapping(value = "/{postId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - @Operation(summary = "게시글 수정 API", description = "특정 게시글을 수정하는 API 입니다.") - public ApiResponse editPost(@RequestHeader("Authorization") String accessToken, - @PathVariable("postId") Long postId, - @RequestPart("postRequestDTO") PostRequestDTO postRequestDTO, - @RequestPart(name = "imageFiles", required = false)List img) { - Member member = memberService.getMemberByToken(accessToken); - return ApiResponse.onSuccess(postService.editPost(postId, postRequestDTO, img, member)); - } - } diff --git a/src/main/java/muit/backend/controller/postController/ReviewController.java b/src/main/java/muit/backend/controller/postController/ReviewController.java index 382af10..a797b94 100644 --- a/src/main/java/muit/backend/controller/postController/ReviewController.java +++ b/src/main/java/muit/backend/controller/postController/ReviewController.java @@ -88,16 +88,6 @@ public ApiResponse getReview(@Reques return ApiResponse.onSuccess(reviewService.getReview(postId,member)); } - @PatchMapping(value = "/{postId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - @Operation(summary = "리뷰 게시글 수정 API", description = "특정 리뷰 게시글을 수정하는 API 입니다.") - public ApiResponse editReview(@RequestHeader("Authorization") String accessToken, - @PathVariable("postId") Long postId, - @RequestPart("reviewRequestDTO") ReviewRequestDTO reviewRequestDTO, - @RequestPart(name = "imageFiles", required = false)List img) { - Member member = memberService.getMemberByToken(accessToken); - - return ApiResponse.onSuccess(reviewService.editReview(postId, reviewRequestDTO, img, member)); - } diff --git a/src/main/java/muit/backend/converter/postConverter/ReviewConverter.java b/src/main/java/muit/backend/converter/postConverter/ReviewConverter.java index f92be40..56d428c 100644 --- a/src/main/java/muit/backend/converter/postConverter/ReviewConverter.java +++ b/src/main/java/muit/backend/converter/postConverter/ReviewConverter.java @@ -44,6 +44,7 @@ public static ReviewResponseDTO.GeneralReviewResponseDTO toReviewResponseDTO(Pos return ReviewResponseDTO.GeneralReviewResponseDTO.builder() .id(review.getId()) + .isMyPost(isMyPost) .nickname(name) .memberId(review.getMember().getId()) .musicalId(review.getMusical().getId()) diff --git a/src/main/java/muit/backend/domain/entity/member/Post.java b/src/main/java/muit/backend/domain/entity/member/Post.java index bf39b45..985af6c 100644 --- a/src/main/java/muit/backend/domain/entity/member/Post.java +++ b/src/main/java/muit/backend/domain/entity/member/Post.java @@ -9,6 +9,7 @@ import muit.backend.domain.entity.musical.Musical; import muit.backend.domain.enums.PostType; import muit.backend.dto.postDTO.LostRequestDTO; +import muit.backend.dto.postDTO.PatchPostRequestDTO; import muit.backend.dto.postDTO.PostRequestDTO; import muit.backend.dto.postDTO.ReviewRequestDTO; import muit.backend.s3.UuidFile; @@ -78,11 +79,13 @@ public void changeMusical(Musical musical){ this.musical = musical; } - public void changeImg(List imgList){ - if(!this.images.isEmpty()){ - this.images.clear(); + public void changeImg(List newImgList, List oldImgList){ + if(oldImgList.size()!=this.images.size()){//기존 사진 개수가 달라졌으면 + this.images.retainAll(oldImgList);//dto에서 보내준 이미지만 남기고 삭제된 항목은 고아객체 만들기 + } + if(!newImgList.isEmpty()){ + this.images.addAll(newImgList);//새로운 이미지 추가된 건 따로 추가 } - this.images.addAll(imgList); } public void increaseMaxIndex(){ @@ -106,26 +109,17 @@ public void changeReportCount(Boolean isAdd){ } - public Post changePost(PostRequestDTO postRequestDTO) { - if(postRequestDTO.getTitle()!=null){this.title = postRequestDTO.getTitle();} - if(postRequestDTO.getContent()!=null){this.content = postRequestDTO.getContent();} - return this; - } - public Post changeLost(LostRequestDTO lostRequestDTO){ - if(lostRequestDTO.getTitle()!=null){this.title = lostRequestDTO.getTitle();} - if(lostRequestDTO.getContent()!=null){this.content = lostRequestDTO.getContent();} - if(lostRequestDTO.getLocation()!=null){this.location = lostRequestDTO.getLocation();} - if(lostRequestDTO.getLostItem()!=null){this.lostItem = lostRequestDTO.getLostItem();} - if(lostRequestDTO.getLostDate()!=null){this.lostDate = lostRequestDTO.getLostDate();} + public Post changePost(PatchPostRequestDTO postRequestDTO){ + if(postRequestDTO.getIsAnonymous()!=null){this.isAnonymous = postRequestDTO.getIsAnonymous();} + if(postRequestDTO.getTitle()!=null){this.title = postRequestDTO.getTitle();} + if(postRequestDTO.getContent()!=null){this.content = postRequestDTO.getContent();} + if(postRequestDTO.getLocation()!=null){this.location = postRequestDTO.getLocation();} + if(postRequestDTO.getLostItem()!=null){this.lostItem = postRequestDTO.getLostItem();} + if(postRequestDTO.getLostDate()!=null){this.lostDate = postRequestDTO.getLostDate();} + if(postRequestDTO.getRating()!=null){this.rating = postRequestDTO.getRating();} return this; } - public Post changeReview(ReviewRequestDTO reviewRequestDTO){ - if(reviewRequestDTO.getTitle()!=null){this.title = reviewRequestDTO.getTitle();} - if(reviewRequestDTO.getContent()!=null){this.content = reviewRequestDTO.getContent();} - if(reviewRequestDTO.getRating()!=null){this.rating = reviewRequestDTO.getRating();} - return this; - } } diff --git a/src/main/java/muit/backend/dto/postDTO/PatchPostRequestDTO.java b/src/main/java/muit/backend/dto/postDTO/PatchPostRequestDTO.java new file mode 100644 index 0000000..db4975a --- /dev/null +++ b/src/main/java/muit/backend/dto/postDTO/PatchPostRequestDTO.java @@ -0,0 +1,25 @@ +package muit.backend.dto.postDTO; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class PatchPostRequestDTO { + private Boolean isAnonymous; + private String title; + private String content; + private List originalImgUrls; + private LocalDate lostDate; + private String location; + private String lostItem; + private Long musicalId; + private Integer rating; + +} diff --git a/src/main/java/muit/backend/service/postService/LostService.java b/src/main/java/muit/backend/service/postService/LostService.java index 4ddcf43..9fb8345 100644 --- a/src/main/java/muit/backend/service/postService/LostService.java +++ b/src/main/java/muit/backend/service/postService/LostService.java @@ -21,7 +21,4 @@ public interface LostService { //게시글 생성 public LostResponseDTO.GeneralLostResponseDTO createLostPost(PostType postType, LostRequestDTO lostRequestDTO, List img, Member member); - - //게시글 수정 - LostResponseDTO.GeneralLostResponseDTO editLostPost(Long postId, LostRequestDTO lostRequestDTO, List img, Member member); } diff --git a/src/main/java/muit/backend/service/postService/LostServiceImpl.java b/src/main/java/muit/backend/service/postService/LostServiceImpl.java index 6709e5a..d5805bf 100644 --- a/src/main/java/muit/backend/service/postService/LostServiceImpl.java +++ b/src/main/java/muit/backend/service/postService/LostServiceImpl.java @@ -119,39 +119,5 @@ public LostResponseDTO.GeneralLostResponseDTO createLostPost(PostType postType, return LostConverter.toGeneralLostResponseDTO(post,member); } - @Override - @Transactional - public LostResponseDTO.GeneralLostResponseDTO editLostPost(Long postId, LostRequestDTO lostRequestDTO, List imgFile, Member member) { - //post 유효성 검사 - Post post = postRepository.findById(postId) - .orElseThrow(() -> new GeneralException(ErrorStatus.POST_NOT_FOUND)); - - //작성자와 동일인인지 검사 - if(post.getMember()!=member){ - throw(new GeneralException(ErrorStatus._FORBIDDEN)); - } - FilePath filePath = switch (post.getPostType()){ - case LOST -> FilePath.LOST; - case FOUND -> FilePath.FOUND; - default -> throw new RuntimeException("Unsupported post type"); - }; - - //기존 이미지 먼저 삭제 - List existingImg = post.getImages(); - if(!existingImg.isEmpty()){ - existingImg.forEach(uuidFileService::deleteFile); - } - //수정된 이미지 삽입 - List imgArr = new ArrayList<>(); - if(imgFile!=null&&!imgFile.isEmpty()){ - imgArr = imgFile.stream().map(img->uuidFileService.createFile(img, FilePath.REVIEW)).collect(Collectors.toList()); - } - post.changeImg(imgArr); - - //나머지 필드 수정 - Post changedPost = post.changeLost(lostRequestDTO); - - return LostConverter.toGeneralLostResponseDTO(changedPost,member); - } } diff --git a/src/main/java/muit/backend/service/postService/PostService.java b/src/main/java/muit/backend/service/postService/PostService.java index 69f3625..922e91f 100644 --- a/src/main/java/muit/backend/service/postService/PostService.java +++ b/src/main/java/muit/backend/service/postService/PostService.java @@ -2,6 +2,7 @@ import muit.backend.domain.entity.member.Member; import muit.backend.domain.enums.PostType; +import muit.backend.dto.postDTO.PatchPostRequestDTO; import muit.backend.dto.postDTO.PostRequestDTO; import muit.backend.dto.postDTO.PostResponseDTO; import muit.backend.dto.reportDTO.ReportRequestDTO; @@ -28,7 +29,7 @@ public interface PostService { public PostResponseDTO.DeleteResultDTO deletePost(Long id, Member member); //게시글 수정 - public PostResponseDTO.GeneralPostResponseDTO editPost(Long postId, PostRequestDTO postRequestDTO, List img, Member member); + public PostResponseDTO.GeneralPostResponseDTO editPost(Long postId, PatchPostRequestDTO postRequestDTO, List img, Member member); PostResponseDTO.likeResultDTO likePost(Long postId, Member member); diff --git a/src/main/java/muit/backend/service/postService/PostServiceImpl.java b/src/main/java/muit/backend/service/postService/PostServiceImpl.java index c3c5ea3..ce42f32 100644 --- a/src/main/java/muit/backend/service/postService/PostServiceImpl.java +++ b/src/main/java/muit/backend/service/postService/PostServiceImpl.java @@ -8,9 +8,11 @@ import muit.backend.domain.entity.member.Post; import muit.backend.domain.entity.member.PostLikes; import muit.backend.domain.entity.member.Report; +import muit.backend.domain.entity.musical.Musical; import muit.backend.domain.enums.PostType; import muit.backend.domain.enums.ReportObjectType; import muit.backend.domain.enums.Role; +import muit.backend.dto.postDTO.PatchPostRequestDTO; import muit.backend.dto.postDTO.PostRequestDTO; import muit.backend.dto.postDTO.PostResponseDTO; import muit.backend.dto.reportDTO.ReportRequestDTO; @@ -26,8 +28,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; @Service @@ -38,6 +39,7 @@ public class PostServiceImpl implements PostService { private final PostLikesRepository postLikesRepository; private final UuidFileService uuidFileService; private final ReportRepository reportRepository; + private final MusicalRepository musicalRepository; //게시글 작성 @Override @@ -143,7 +145,7 @@ public PostResponseDTO.DeleteResultDTO deletePost(Long id, Member member) { //게시글 수정 @Override @Transactional - public PostResponseDTO.GeneralPostResponseDTO editPost(Long postId, PostRequestDTO requestDTO, List imgFile, Member member) { + public PostResponseDTO.GeneralPostResponseDTO editPost(Long postId, PatchPostRequestDTO requestDTO, List imgFile, Member member) { //post 유효성 검사 Post post = postRepository.findById(postId) @@ -154,17 +156,25 @@ public PostResponseDTO.GeneralPostResponseDTO editPost(Long postId, PostRequestD throw(new GeneralException(ErrorStatus._FORBIDDEN)); } - //기존 이미지 먼저 삭제 - List existingImg = post.getImages(); - if(!existingImg.isEmpty()){ - existingImg.forEach(uuidFileService::deleteFile); + //리뷰형 게시글일 경우 musical 변경 반영 + if(post.getPostType().equals(PostType.REVIEW)||post.getPostType().equals(PostType.SIGHT)){ + if(requestDTO.getMusicalId()!=null){ + Musical musical = musicalRepository.findById(requestDTO.getMusicalId()).orElseThrow(() -> new GeneralException(ErrorStatus.MUSICAL_NOT_FOUND)); + post.changeMusical(musical); + } + } - //수정된 이미지 삽입 - List imgArr = new ArrayList<>(); + + //기존 이미지 url->UuidFile화 + List dtoImgs = requestDTO.getOriginalImgUrls().stream().map(file-> + uuidFileService.getUuidFileByFileUrl(file).orElseThrow(()->new GeneralException(ErrorStatus.IMAGE_NOT_FOUND))).toList(); + + //수정된 이미지 s3 생성 + List newImgs = new ArrayList<>(); if(imgFile!=null&&!imgFile.isEmpty()){ - imgArr = imgFile.stream().map(img->uuidFileService.createFile(img, FilePath.BLIND)).collect(Collectors.toList()); + newImgs = imgFile.stream().map(img->uuidFileService.createFile(img, FilePath.BLIND)).collect(Collectors.toList()); } - post.changeImg(imgArr); + post.changeImg(newImgs,dtoImgs); //필드 수정 Post changedPost = post.changePost(requestDTO); diff --git a/src/main/java/muit/backend/service/postService/ReviewService.java b/src/main/java/muit/backend/service/postService/ReviewService.java index 766f244..ee51058 100644 --- a/src/main/java/muit/backend/service/postService/ReviewService.java +++ b/src/main/java/muit/backend/service/postService/ReviewService.java @@ -17,6 +17,4 @@ public interface ReviewService { ReviewResponseDTO.ReviewListResponseDTO getReviewList(PostType postType, Member member, Integer page, Integer size, String musicalName, String location); ReviewResponseDTO.GeneralReviewResponseDTO getReview(Long postId,Member member); - - ReviewResponseDTO.GeneralReviewResponseDTO editReview(Long postId, ReviewRequestDTO reviewRequestDTO, List img, Member member); } diff --git a/src/main/java/muit/backend/service/postService/ReviewServiceImpl.java b/src/main/java/muit/backend/service/postService/ReviewServiceImpl.java index c027c57..9bad637 100644 --- a/src/main/java/muit/backend/service/postService/ReviewServiceImpl.java +++ b/src/main/java/muit/backend/service/postService/ReviewServiceImpl.java @@ -83,50 +83,4 @@ public ReviewResponseDTO.GeneralReviewResponseDTO getReview(Long postId,Member m return ReviewConverter.toReviewResponseDTO(review,member); } - //리뷰 수정 - @Override - @Transactional - public ReviewResponseDTO.GeneralReviewResponseDTO editReview(Long postId, ReviewRequestDTO requestDTO, List imgFile,Member member) { - - //post 유효성 검사 - Post review = postRepository.findById(postId) - .orElseThrow(() -> new GeneralException(ErrorStatus.POST_NOT_FOUND)); - - //작성자와 동일인인지 검사 - if(review.getMember()!=member){ - throw(new GeneralException(ErrorStatus._FORBIDDEN)); - } - - //musical 유효성 검사 - if(requestDTO.getMusicalId()!=null){Long musicalId = requestDTO.getMusicalId(); - Musical musical = musicalRepository.findById(musicalId) - .orElseThrow(() -> new GeneralException(ErrorStatus.MUSICAL_NOT_FOUND)); - //musical 먼저 수정 - review.changeMusical(musical);} - - FilePath filePath = switch (review.getPostType()){ - case REVIEW -> FilePath.REVIEW; - case SIGHT -> FilePath.SIGHT; - default -> throw new RuntimeException("Unsupported post type"); - }; - - //기존 이미지 먼저 삭제 - List existingImg = review.getImages(); - if(!existingImg.isEmpty()){ - existingImg.forEach(uuidFileService::deleteFile); - } - //수정된 이미지 삽입 - List imgArr = new ArrayList<>(); - if(imgFile!=null&&!imgFile.isEmpty()){ - - imgArr = imgFile.stream().map(img->uuidFileService.createFile(img, filePath)).collect(Collectors.toList()); - } - review.changeImg(imgArr); - - - //나머지 필드 수정 - Post changedPost = review.changeReview(requestDTO); - - return ReviewConverter.toReviewResponseDTO(changedPost, member); - } }