Skip to content

Commit

Permalink
feat : 임시저장 API
Browse files Browse the repository at this point in the history
  • Loading branch information
moonyaeyoon committed Jul 27, 2024
1 parent 02b10a7 commit 5be7b7b
Show file tree
Hide file tree
Showing 7 changed files with 110 additions and 23 deletions.
5 changes: 5 additions & 0 deletions src/main/java/meltingpot/server/domain/entity/post/Post.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public class Post extends BaseEntity {
@Enumerated(EnumType.STRING)
private PostType postType;

private Boolean isDraft;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private Account account;
Expand All @@ -61,4 +63,7 @@ public void setPostImages(List<PostImage> postImages) {
.collect(Collectors.toList());
}

public void setIsDraft(boolean isDraft) {
this.isDraft = isDraft;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Optional;

public interface PostRepository extends JpaRepository<Post, Long> {

Expand All @@ -23,4 +24,6 @@ public interface PostRepository extends JpaRepository<Post, Long> {
Slice<Post> findAllByAccountAndDeletedAtIsNullOrderByIdDesc(Account account, Pageable page);

Slice<Post> findByIdAndDeletedAtIsNull(Long id);

Optional<Post> findByAccountAndIsDraftTrue(Account account);
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,14 @@
public class PostController {
private final PostService postService;

@Operation(summary = "게시물 작성, 이미지가 없을 때는 빈 값으로 주시면 됩니다. ")
@Operation(summary = "게시물 작성", description="requestParam으로 임시저장 여부를 알려주세요." +
"이미지가 없을 때는 빈 값으로 주시면 됩니다.")
@PostMapping("")
public ResponseEntity<ResponseData> createPost( @CurrentUser Account account,@RequestBody PostCreateRequest createPostDTO) {
public ResponseEntity<ResponseData> createPost( @CurrentUser Account account,
@RequestBody PostCreateRequest postCreateRequest,
@RequestParam boolean isDraft) {
try{
return ResponseData.toResponseEntity(postService.createPost(createPostDTO,account));
return ResponseData.toResponseEntity(postService.createPost(postCreateRequest,account,isDraft));
}catch (NoSuchElementException e) {
return ResponseData.toResponseEntity(ResponseCode.POST_CREATE_FAIL);
}
Expand Down Expand Up @@ -83,4 +86,14 @@ public ResponseEntity<ResponseData> deletePost(@CurrentUser Account account,@Pat
}
}

@GetMapping("/temp-saved")
@Operation(summary = "임시저장된 글 불러오기", description = "임시저장된 글 불러오기")
public ResponseEntity<ResponseData<PostDetailResponse>> getTempPost(@CurrentUser Account account) {
try {
return ResponseData.toResponseEntity(ResponseCode.POST_DETAIL_FETCH_SUCCEESS,postService.getTempPost(account));
} catch (NoSuchElementException e) {
return ResponseData.toResponseEntity(ResponseCode.POST_NOT_FOUND,null);
}
}

}
15 changes: 15 additions & 0 deletions src/main/java/meltingpot/server/post/dto/PostDetailResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,19 @@ public static PostDetailResponse of(Post post, CommentsListResponse commentsList
.updatedAt(post.getUpdatedAt())
.build();
}

public static PostDetailResponse from(Post post) {
List<ImageData> imgData = post.getPostImages().stream()
.map(postImage -> new ImageData(postImage.getId(), postImage.getImageUrl()))
.collect(Collectors.toList());

return PostDetailResponse.builder()
.postId(post.getId())
.name(post.getAccount().getName())
.title(post.getTitle())
.content(post.getContent())
.imgData(imgData)
.updatedAt(post.getUpdatedAt())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package meltingpot.server.post.dto;

public class TempPostDetailResponse {
}
86 changes: 66 additions & 20 deletions src/main/java/meltingpot/server/post/service/PostService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
import lombok.*;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.stream.Collectors;

import meltingpot.server.comment.dto.CommentsListResponse;
Expand All @@ -25,10 +26,13 @@
import meltingpot.server.util.r2.FileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Pageable;
import org.springframework.web.server.ResponseStatusException;

import static meltingpot.server.util.ResponseCode.POST_NOT_FOUND;


@Service
Expand All @@ -44,30 +48,34 @@ public class PostService {


/*post 작성하기*/
public ResponseCode createPost(PostCreateRequest createPostDTO,Account account){
Post post = createPostDTO.toEntity(account);
List<String> postImgUrls = Collections.emptyList();
List<PostImage> postImages = createPostImages(createPostDTO.getImageKeys(), post, account);
post.setPostImages(postImages);
public ResponseCode createPost(PostCreateRequest postCreateRequest, Account account, boolean isDraft) {
Optional<Post> optionalDraft = getDraftPost(account);
Post post = optionalDraft.orElseGet(() -> postCreateRequest.toEntity(account));
System.out.println("Post " + post.getId() + post.getTitle() + post.getIsDraft());

if (optionalDraft.isPresent()) {
updatePostContent(post, account, postCreateRequest);
}
setPostImages(post, account, postCreateRequest);
// isDraft 값을 설정하기 전에 현재 상태 출력
System.out.println("Setting isDraft for post with ID " + post.getId() + " to " + isDraft);
post.setIsDraft(isDraft);

// isDraft 값 설정 후 출력
System.out.println("Post isDraft status: " + post.getIsDraft());

postRepository.save(post);
return ResponseCode.CREATE_POST_SUCCESS;

return isDraft ? ResponseCode.DRAFT_SAVE_SUCCESS : ResponseCode.CREATE_POST_SUCCESS;
}


/*post 수정하기*/
public ResponseCode updatePost(PostCreateRequest updateRequest,Long postId, Account account){
Post post = findPostById(postId);

post.setTitle(updateRequest.getTitle());
post.setContent(updateRequest.getContent());

// 기존의 모든 PostImage 삭제
if (post.getPostImages() != null) {
postImageRepository.deleteAll(post.getPostImages());

}
// 새로운 PostImage 설정
List<PostImage> postImages = createPostImages(updateRequest.getImageKeys(), post, account);
post.setPostImages(postImages);
isAuthenticated ( post, account);
updatePostContent(post, account, updateRequest);
setPostImages(post,account,updateRequest);

postRepository.save(post);

Expand Down Expand Up @@ -95,7 +103,7 @@ public PostsListResponse getPostsList(Account account, PostType postType, Long
/*post 삭제하기*/
public ResponseCode deletePost(Long postId, Account account){
Post post = findPostById(postId);
Account postAccount = findAccountById(post.getAccount().getId());
isAuthenticated ( post, account);

// 게시물에 연관된 이미지 삭제
if (!post.getPostImages().isEmpty()) {
Expand All @@ -114,6 +122,18 @@ public ResponseCode deletePost(Long postId, Account account){

}

/* 임시저장된 글 불러오기 */
public PostDetailResponse getTempPost (Account account ){
Optional<Post> optionalDraft = getDraftPost(account);
if(optionalDraft.isPresent()){
Post draftPost = optionalDraft.get();
return PostDetailResponse.from(draftPost);
}else{
throw new NoSuchElementException(ResponseCode.POST_NOT_FOUND.getDetail());
}
}



private Account findAccountById(Long accountId) {
return accountRepository.findById(accountId)
Expand All @@ -125,6 +145,12 @@ private Post findPostById(Long postId) {
.orElseThrow(() -> new RuntimeException("게시글을 찾을 수 없습니다."));
}

private void isAuthenticated (Post post, Account account) {
if (!post.getAccount().getId().equals(account.getId())) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "권한이 없습니다.");
}
}

private List<String> getCdnUrls(List<String> imageKeys) {
return imageKeys.stream()
.map(imageKey -> {
Expand All @@ -134,6 +160,19 @@ private List<String> getCdnUrls(List<String> imageKeys) {
.collect(Collectors.toList());
}

private void updatePostContent(Post post, Account account, PostCreateRequest updateRequest) {
post.setTitle(updateRequest.getTitle());
post.setContent(updateRequest.getContent());

// 기존의 모든 PostImage 삭제
if (post.getPostImages() != null && !post.getPostImages().isEmpty()) {
postImageRepository.deleteAll(post.getPostImages());
post.getPostImages().clear();
}
}



private List<PostImage> createPostImages(List<String> imageKeys, Post post, Account account) {
List<String> postImgUrls = getCdnUrls(imageKeys);
return postImgUrls.stream()
Expand Down Expand Up @@ -204,6 +243,13 @@ private CommentsListResponse fetchCommentsList(Long postId, Long cursor, int pag
return CommentsListResponse.from(commentDetailDTOs, nextCursor, isLast);
}

private Optional<Post> getDraftPost(Account account) {
return postRepository.findByAccountAndIsDraftTrue(account);
}

private void setPostImages(Post post, Account account,PostCreateRequest postRequest) {
List<PostImage> postImages = createPostImages(postRequest.getImageKeys(), post, account);
post.setPostImages(postImages);
}
}

1 change: 1 addition & 0 deletions src/main/java/meltingpot/server/util/ResponseCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public enum ResponseCode {
SIGNUP_SUCCESS(CREATED, "회원가입 성공"),
CREATE_CHAT_ROOM_SUCCESS(CREATED, "채팅방 생성 성공"),
CREATE_POST_SUCCESS(CREATED, "게시물 작성 성공"),
DRAFT_SAVE_SUCCESS(CREATED,"게시물 임시 저장 성공"),
CREATE_COMMENT_SUCCESS(CREATED, "댓글 작성 성공"),
CREATE_CHILD_COMMENT_SUCCESS(CREATED, "대댓글 작성 성공"),
REPORT_CREATE_SUCCESS(CREATED, "신고 작성 성공"),
Expand Down

0 comments on commit 5be7b7b

Please sign in to comment.