diff --git a/src/main/java/inandout/backend/common/response/BaseErrorResponse.java b/src/main/java/inandout/backend/common/response/BaseErrorResponse.java index 89dc0e2..1570bc3 100644 --- a/src/main/java/inandout/backend/common/response/BaseErrorResponse.java +++ b/src/main/java/inandout/backend/common/response/BaseErrorResponse.java @@ -12,7 +12,7 @@ @Getter @RequiredArgsConstructor @JsonPropertyOrder({"code", "status", "message", "timestamp"}) -public class BaseErrorResponse implements ResponseStatus { +public class BaseErrorResponse extends Throwable implements ResponseStatus { private final int code; private final int status; private final String message; diff --git a/src/main/java/inandout/backend/config/SecurityConfig.java b/src/main/java/inandout/backend/config/SecurityConfig.java index a07339c..57a5ad9 100644 --- a/src/main/java/inandout/backend/config/SecurityConfig.java +++ b/src/main/java/inandout/backend/config/SecurityConfig.java @@ -73,7 +73,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .requestMatchers("/main", "/ispublic", "/password", "/check-password", "/nickname", "/chat", "/ws/chat", "/myroom/chat","/myroom/post/{postId}/chat", "/others/room/detail/{postId}/chat", "/myroom/addstuff", - "/myroom/post/{postId}","/others","/others/post/{postId}").authenticated()); + "/myroom/post/{postId}","/others","/others/post/{postId}","/myroom/updatestuff").authenticated()); //LoginFilter 이전에 JWTFilter 등록 http.addFilterBefore(new JWTFilter(jwtUtil), LoginFilter.class); diff --git a/src/main/java/inandout/backend/controller/myroom/MyRoomController.java b/src/main/java/inandout/backend/controller/myroom/MyRoomController.java index 4c0d1a8..fa09557 100644 --- a/src/main/java/inandout/backend/controller/myroom/MyRoomController.java +++ b/src/main/java/inandout/backend/controller/myroom/MyRoomController.java @@ -47,7 +47,6 @@ public BaseResponse myRoomAddStuffController(@Request @RequestPart(value = "file") List multipartFile) { MyRoomAddStuffResponseDTO myRoomAddStuffResponseDTO = myRoomService.addStuff(myRoomAddStuffRequestDTO, multipartFile); - return new BaseResponse<>(myRoomAddStuffResponseDTO); } diff --git a/src/main/java/inandout/backend/controller/post/PostController.java b/src/main/java/inandout/backend/controller/post/PostController.java index fc3fbed..59dda53 100644 --- a/src/main/java/inandout/backend/controller/post/PostController.java +++ b/src/main/java/inandout/backend/controller/post/PostController.java @@ -1,14 +1,27 @@ package inandout.backend.controller.post; +import inandout.backend.common.exception.BaseException; import inandout.backend.common.response.BaseResponse; +import inandout.backend.dto.myroom.MyRoomAddStuffRequestDTO; import inandout.backend.dto.post.InOutRequestDTO; import inandout.backend.dto.post.InOutResponseDTO; +import inandout.backend.dto.post.UpdateStuffRequestDTO; +import inandout.backend.entity.post.Post; +import inandout.backend.entity.post.PostImage; +import inandout.backend.repository.post.PostJPARepository; +import inandout.backend.service.myroom.S3Service; import inandout.backend.service.post.PostService; import inandout.backend.service.stuff.StuffService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Optional; + +import static inandout.backend.common.response.status.BaseExceptionResponseStatus.BAD_REQUEST; @RestController @Slf4j @@ -21,6 +34,12 @@ public class PostController { @Autowired public StuffService stuffService; + @Autowired + public PostJPARepository postJPARepository; + + @Autowired + public S3Service s3Service; + @PostMapping("/inout") public BaseResponse inOutController(@RequestBody InOutRequestDTO inOutRequestDTO) throws Exception { log.info("in/out"); @@ -31,4 +50,29 @@ public BaseResponse inOutController(@RequestBody InOutRequestD return new BaseResponse<>(inOutResponseDTO); } + @PostMapping("/myroom/updatestuff") + public BaseResponse updateStuffController(@RequestPart(value = "request") UpdateStuffRequestDTO updateStuffRequestDTO, + @RequestPart(value = "file") List multipartFile){ + System.out.println("PostController/updateStuffController"); + + //게시물 찾기 + Optional post = postJPARepository.findById(updateStuffRequestDTO.getPostId()); + if(!post.isPresent()){ + throw new BaseException(BAD_REQUEST); // 게시물 없음 + } + + //이미지 빼고 수정 + postService.updatePost(post.get(), updateStuffRequestDTO); + + //S3, DB에서 기존 이미지 삭제 + postService.deleteImage(post.get()); + + //S3에 새로운 이미지 삽입, urls 받아오기 & DB에 저장 + List imageUrls = s3Service.uploadFile(multipartFile, String.valueOf(post.get().getId())); + postService.updatePostImages(post.get(), imageUrls); + + + return new BaseResponse<>("success"); + } + } diff --git a/src/main/java/inandout/backend/dto/post/UpdateStuffRequestDTO.java b/src/main/java/inandout/backend/dto/post/UpdateStuffRequestDTO.java new file mode 100644 index 0000000..ad5a44d --- /dev/null +++ b/src/main/java/inandout/backend/dto/post/UpdateStuffRequestDTO.java @@ -0,0 +1,19 @@ +package inandout.backend.dto.post; + + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UpdateStuffRequestDTO { + + private Integer postId; + private String title; + private String inContent; + private String outContent; + + +} diff --git a/src/main/java/inandout/backend/jwt/JWTFilter.java b/src/main/java/inandout/backend/jwt/JWTFilter.java index cf3ac98..52eb273 100644 --- a/src/main/java/inandout/backend/jwt/JWTFilter.java +++ b/src/main/java/inandout/backend/jwt/JWTFilter.java @@ -38,7 +38,8 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse || request.getRequestURI().equals("/join") || request.getRequestURI().equals("/auth/verify") || request.getRequestURI().equals("/kakaologin/callback") || request.getRequestURI().equals("/kakaologin") - || request.getRequestURI().equals("/find-password")) { + || request.getRequestURI().equals("/find-password") + ) { filterChain.doFilter(request, response); return; } diff --git a/src/main/java/inandout/backend/repository/post/PostImageJPARepository.java b/src/main/java/inandout/backend/repository/post/PostImageJPARepository.java index 1173046..e85e8e9 100644 --- a/src/main/java/inandout/backend/repository/post/PostImageJPARepository.java +++ b/src/main/java/inandout/backend/repository/post/PostImageJPARepository.java @@ -12,4 +12,7 @@ public interface PostImageJPARepository extends JpaRepository findUrlByPostId(@Param(value = "post_id") Integer postId); + @Query("DELETE FROM PostImage pi WHERE pi.post.id = :post_id") + void deleteByPostId(@Param(value = "post_id") Integer postId); + } diff --git a/src/main/java/inandout/backend/repository/post/PostRepository.java b/src/main/java/inandout/backend/repository/post/PostRepository.java index a064b6d..1bab534 100644 --- a/src/main/java/inandout/backend/repository/post/PostRepository.java +++ b/src/main/java/inandout/backend/repository/post/PostRepository.java @@ -9,6 +9,7 @@ import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository @RequiredArgsConstructor @@ -119,4 +120,12 @@ public Post getPostByRoodId(Integer chatRoomId) throws Exception { return post.get(0); } + + @Transactional + public void updatePost(Integer postId, String title, String inContent, String outContent) { + em.createQuery("UPDATE Post p SET p.title = :title, p.inContent = :inContent, p.outContent = :outContent " + + "WHERE p.id = :postId").setParameter("title", title).setParameter("inContent", inContent). + setParameter("outContent", outContent).setParameter("postId", postId) + .executeUpdate(); + } } diff --git a/src/main/java/inandout/backend/service/myroom/MyRoomService.java b/src/main/java/inandout/backend/service/myroom/MyRoomService.java index 37e720e..6fe2246 100644 --- a/src/main/java/inandout/backend/service/myroom/MyRoomService.java +++ b/src/main/java/inandout/backend/service/myroom/MyRoomService.java @@ -150,12 +150,14 @@ public MyRoomAddStuffResponseDTO addStuff(MyRoomAddStuffRequestDTO myRoomAddStuf chatRoomJPARepository.save(chatRoom); MyRoomAddStuffResponseDTO myRoomAddStuffResponseDTO = new MyRoomAddStuffResponseDTO(chatRoom.getId()); - // s3에 이미지 저장 - List imageUrls = s3Service.uploadFile(multipartFile); //post 객체 생성 Post post = new Post(member.get(), title, outContent, inContent, 0, 0, currentDateTime, currentDateTime, chatRoom); - postJPARepository.save(post); + Integer postId = postJPARepository.save(post).getId(); + System.out.println("postId: "+postId); + + // s3에 이미지 저장 + List imageUrls = s3Service.uploadFile(multipartFile, String.valueOf(postId)); // url을 DB에 저장 for (String imageUrl : imageUrls) { diff --git a/src/main/java/inandout/backend/service/myroom/S3Service.java b/src/main/java/inandout/backend/service/myroom/S3Service.java index b8cb762..6d4b3e6 100644 --- a/src/main/java/inandout/backend/service/myroom/S3Service.java +++ b/src/main/java/inandout/backend/service/myroom/S3Service.java @@ -27,13 +27,15 @@ public class S3Service { private final AmazonS3 s3Client; - public List uploadFile(List multipartFile) { + public List uploadFile(List multipartFile, String postId) { System.out.println("S3Service/uploadFile"); + System.out.println("uploadFile/postId: "+postId); List fileNameList = new ArrayList<>(); multipartFile.forEach(file -> { System.out.println(file.toString()); String fileName = createFileName(file.getOriginalFilename()); // 파일 이름 가져옴 + fileName = postId+"-"+fileName; ObjectMetadata objectMetadata = new ObjectMetadata(); // s3에 업로드되는 객체 관련 정보 objectMetadata.setContentLength(file.getSize()); objectMetadata.setContentType(file.getContentType()); @@ -54,6 +56,18 @@ public List uploadFile(List multipartFile) { return fileNameList; } + + public void deleteFile(Integer postId, List imageUrls){ + System.out.println("deleteFile from S3!"); + + for (String imageUrl : imageUrls) { + System.out.println("삭제: " + imageUrls); + s3Client.deleteObject(bucket, imageUrl); + } + + + } + // 파일명 중복 방지 (UUID) private String createFileName(String fileName) { return UUID.randomUUID().toString().concat(getFileExtension(fileName)); diff --git a/src/main/java/inandout/backend/service/post/PostService.java b/src/main/java/inandout/backend/service/post/PostService.java index 710663b..fa73064 100644 --- a/src/main/java/inandout/backend/service/post/PostService.java +++ b/src/main/java/inandout/backend/service/post/PostService.java @@ -1,15 +1,20 @@ package inandout.backend.service.post; +import inandout.backend.common.exception.BaseException; +import inandout.backend.common.response.BaseErrorResponse; import inandout.backend.dto.chat.ChatResponseDTO; import inandout.backend.dto.myroom.PostResponseDTO; +import inandout.backend.dto.post.UpdateStuffRequestDTO; import inandout.backend.entity.post.InOut; import inandout.backend.entity.post.Post; +import inandout.backend.entity.post.PostImage; import inandout.backend.repository.chat.ChatRepository; import inandout.backend.repository.post.InOutRepository; import inandout.backend.repository.post.PostImageJPARepository; import inandout.backend.repository.post.PostJPARepository; import inandout.backend.repository.post.PostRepository; import inandout.backend.service.chat.ChatService; +import inandout.backend.service.myroom.S3Service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,6 +23,8 @@ import java.util.List; import java.util.Optional; +import static inandout.backend.common.response.status.BaseExceptionResponseStatus.BAD_REQUEST; + @Service public class PostService { @Autowired @@ -38,6 +45,9 @@ public class PostService { @Autowired public InOutRepository inOutRepository; + @Autowired + public S3Service s3Service; + public PostResponseDTO getPost(Integer memberId, Integer postId) { //postId로 memberId -> memberName Integer ownerId = chatRepository.getMemberIdByPostId(postId); @@ -115,5 +125,32 @@ public Integer plusOutCount(Integer postId) { } + public void updatePost(Post post, UpdateStuffRequestDTO updateStuffRequestDTO) { + + postRepository.updatePost(post.getId(), updateStuffRequestDTO.getTitle(), updateStuffRequestDTO.getInContent(), updateStuffRequestDTO.getOutContent()); + + } + + + public void deleteImage(Post post) { + //해당 게시물 기존 이미지 가져오기 & DB에서 삭제 + List imageUrls = postImageJPARepository.findUrlByPostId(post.getId()); + //DB 에서 삭제 + postImageJPARepository.deleteById(post.getId()); + System.out.println("postimage 삭제"); + + //S3에서 삭제 + s3Service.deleteFile(post.getId(), imageUrls); + + + } + + public void updatePostImages(Post post, List imageUrls) { + LocalDateTime currentDateTime = LocalDateTime.now(ZoneId.of("Asia/Seoul")); + for (String imageUrl : imageUrls) { + PostImage postImage = new PostImage(post, imageUrl, currentDateTime, currentDateTime); + postImageJPARepository.save(postImage); + } + } }