Skip to content

Commit

Permalink
refactor: (#95) 게시글 작성 기능 API 명세의 변경에 따라 게시글 내용의 이미지 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
tjdtls690 committed Jul 30, 2023
1 parent 2188b4d commit 059a90d
Show file tree
Hide file tree
Showing 14 changed files with 256 additions and 83 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.votogether.domain.post.controller;

import com.votogether.domain.member.entity.Gender;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.post.dto.request.PostCreateRequest;
import com.votogether.domain.member.entity.SocialType;
import com.votogether.domain.post.dto.request.PostRequest;
import com.votogether.domain.post.dto.response.PostResponse;
import com.votogether.domain.post.dto.response.VoteOptionStatisticsResponse;
import com.votogether.domain.post.entity.PostClosingType;
Expand Down Expand Up @@ -40,11 +42,12 @@ public class PostController {
})
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Void> save(
@RequestPart final PostCreateRequest request,
@RequestPart final List<MultipartFile> images,
@RequestPart final PostRequest request,
@RequestPart final List<MultipartFile> contentImages,
@RequestPart final List<MultipartFile> optionImages,
@Auth final Member loginMember
) {
final long postId = postService.save(request, loginMember, images);
final long postId = postService.save(request, loginMember, contentImages, optionImages);
return ResponseEntity.created(URI.create("/posts/" + postId)).build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.votogether.domain.post.dto.request;

import lombok.Builder;

@Builder
public record PostOptionRequest(
String content,
String imageUrl
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@

@Schema(name = "게시글 관련 데이터", description = "게시글에 관련한 데이터들입니다.")
@Builder
public record PostCreateRequest(
public record PostRequest(
List<Long> categoryIds,
String title,
String content,
List<String> postOptionContents,
String imageUrl,
List<PostOptionRequest> postOptions,

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
LocalDateTime deadline
) {

}
Original file line number Diff line number Diff line change
Expand Up @@ -88,24 +88,20 @@ public void mapPostOptionsByElements(
final List<String> postOptionContents,
final List<MultipartFile> images
) {
this.postOptions.addAllPostOptions(toPostOptionEntities(postOptionContents, images));
this.postOptions.addAllPostOptions(toPostOptions(postOptionContents, images));
}

private List<PostOption> toPostOptionEntities(
private List<PostOption> toPostOptions(
final List<String> postOptionContents,
final List<MultipartFile> images
final List<MultipartFile> optionsImages
) {
return toPostOptions(postOptionContents, images);
}

private List<PostOption> toPostOptions(final List<String> postOptionContents, final List<MultipartFile> images) {
return IntStream.rangeClosed(FIRST_OPTION_SEQUENCE, postOptionContents.size())
.mapToObj(postOptionSequence ->
PostOption.of(
postOptionContents.get(postOptionSequence - 1),
this,
postOptionSequence,
images.get(postOptionSequence - 1)
optionsImages.get(postOptionSequence - 1)
)
)
.toList();
Expand Down Expand Up @@ -160,6 +156,10 @@ public boolean isWriter(final Member member) {
return Objects.equals(this.writer, member);
}

public void addContentImage(final MultipartFile contentImage) {
this.postBody.addContentImage(this, contentImage);
}

public long getFinalTotalVoteCount(final Member loginMember) {
if (isVisibleVoteResult(loginMember)) {
return this.totalVoteCount;
Expand All @@ -176,5 +176,4 @@ public void addComment(final Comment comment) {
comments.add(comment);
comment.setPost(this);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.persistence.Embedded;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
Expand All @@ -18,10 +20,18 @@ public class PostBody {
@Column(length = 1000, nullable = false)
private String content;

@Embedded
private PostContentImages postContentImages;

@Builder
private PostBody(final String title, final String content) {
this.title = title;
this.content = content;
this.postContentImages = new PostContentImages();
}

public void addContentImage(final Post post, final MultipartFile contentImage) {
this.postContentImages.addContentImage(post, contentImage);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.votogether.domain.post.entity;

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.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class PostContentImage {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id", nullable = false)
private Post post;

@Column
private String imageUrl;

@Builder
public PostContentImage(final Post post, final String imageUrl) {
this.post = post;
this.imageUrl = imageUrl;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.votogether.domain.post.entity;

import com.votogether.domain.post.util.ImageUploader;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Embeddable;
import jakarta.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Embeddable
public class PostContentImages {

@OneToMany(mappedBy = "post", cascade = CascadeType.PERSIST, orphanRemoval = true)
private List<PostContentImage> contentImages = new ArrayList<>();

public void addContentImage(final Post post, final MultipartFile contentImage) {
final String contentImageUrl = ImageUploader.upload(contentImage);
this.contentImages.add(getPostContentImage(post, contentImageUrl));
}

private PostContentImage getPostContentImage(final Post post, final String contentImageUrl) {
return PostContentImage.builder()
.post(post)
.imageUrl(contentImageUrl)
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.votogether.domain.common.BaseEntity;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.post.util.ImageUploader;
import com.votogether.domain.vote.entity.Vote;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
Expand All @@ -13,10 +14,6 @@
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
Expand Down Expand Up @@ -68,27 +65,16 @@ public static PostOption of(
final String postOptionContent,
final Post post,
final int postOptionSequence,
final MultipartFile image
final MultipartFile optionImage
) {
if (!image.isEmpty()) {
final String imageUrl = saveImageToPath(image);
if (!optionImage.isEmpty()) {
final String imageUrl = ImageUploader.upload(optionImage);
return toPostOptionEntity(post, postOptionSequence, postOptionContent, imageUrl);
}

return toPostOptionEntity(post, postOptionSequence, postOptionContent, "");
}

private static String saveImageToPath(final MultipartFile image) {
final String absolutePath = new File("").getAbsolutePath();
final String imageUrl = absolutePath + "/images/" + image.getOriginalFilename();

try {
Files.write(Paths.get(imageUrl), image.getBytes());
} catch (IOException ignore) {
}
return imageUrl;
}

private static PostOption toPostOptionEntity(
final Post post,
final Integer postOptionSequence,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
import com.votogether.domain.category.repository.CategoryRepository;
import com.votogether.domain.member.entity.Gender;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.post.dto.request.PostCreateRequest;
import com.votogether.domain.post.dto.request.PostOptionRequest;
import com.votogether.domain.post.dto.request.PostRequest;
import com.votogether.domain.post.dto.response.PostResponse;
import com.votogether.domain.post.dto.response.VoteOptionStatisticsResponse;
import com.votogether.domain.post.entity.Post;
Expand Down Expand Up @@ -69,43 +70,51 @@ private void initPostClosingTypeMapper() {

@Transactional
public Long save(
final PostCreateRequest postCreateRequest,
final PostRequest postRequest,
final Member loginMember,
final List<MultipartFile> images
final List<MultipartFile> contentImages,
final List<MultipartFile> optionImages
) {
final List<Category> categories = categoryRepository.findAllById(postCreateRequest.categoryIds());
final Post post = toPostEntity(postCreateRequest, loginMember, images, categories);
final List<Category> categories = categoryRepository.findAllById(postRequest.categoryIds());
final Post post = toPostEntity(postRequest, loginMember, contentImages, optionImages, categories);

return postRepository.save(post).getId();
}

private Post toPostEntity(
final PostCreateRequest postCreateRequest,
final PostRequest postRequest,
final Member loginMember,
final List<MultipartFile> images,
final List<MultipartFile> contentImages,
final List<MultipartFile> optionImages,
final List<Category> categories
) {
final Post post = toPost(postCreateRequest, loginMember);
final Post post = toPost(postRequest, loginMember);
final List<String> postOptionContents = postRequest.postOptions().stream()
.map(PostOptionRequest::content)
.toList();

final List<String> postOptionContents = postCreateRequest.postOptionContents();
post.mapPostOptionsByElements(postOptionContents, images);
post.mapPostOptionsByElements(postOptionContents, optionImages);
post.mapCategories(categories);
post.addContentImage(contentImages.get(0));

return post;
}

private Post toPost(final PostCreateRequest postCreateRequest, final Member loginMember) {
private Post toPost(
final PostRequest postRequest,
final Member loginMember
) {
return Post.builder()
.writer(loginMember)
.postBody(toPostBody(postCreateRequest))
.deadline(postCreateRequest.deadline())
.postBody(toPostBody(postRequest))
.deadline(postRequest.deadline())
.build();
}

private PostBody toPostBody(final PostCreateRequest postCreateRequest) {
private PostBody toPostBody(final PostRequest postRequest) {
return PostBody.builder()
.title(postCreateRequest.title())
.content(postCreateRequest.content())
.title(postRequest.title())
.content(postRequest.content())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.votogether.domain.post.util;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ImageUploader {

public static String upload(final MultipartFile image) {
final String absolutePath = new File("").getAbsolutePath();
final String imageUrl = absolutePath + "/images/" + image.getOriginalFilename();

try {
Files.write(Paths.get(imageUrl), image.getBytes());
} catch (IOException ignore) {
}

return imageUrl;
}

}
Loading

0 comments on commit 059a90d

Please sign in to comment.