Skip to content

Commit

Permalink
[#59] 태그 API 기능 구현
Browse files Browse the repository at this point in the history
* feat: 태그 엔티티 추가

- PostTag 엔티티 추가

- RootTag 엔티티 추가

- UserTag 엔티티 추가

- User 연관 관계 수정

- Post 연관 관계 수정

* feat: 태그 레포지터리 추가

- UserTagRepository

- PostTagRepository

- RootTagRepository

* feat: tag 서비스, 컨트롤러 기능 구현

- UserTag

- PostTag

- RootTag

* test: 태그 테스트 추가

* add: V2.1 Tag 추가
  • Loading branch information
hyena0608 authored Jan 25, 2023
1 parent 7870753 commit db0307d
Show file tree
Hide file tree
Showing 30 changed files with 946 additions and 99 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,16 @@
import com.prgrms.prolog.domain.post.dto.PostRequest.CreateRequest;
import com.prgrms.prolog.domain.post.dto.PostRequest.UpdateRequest;
import com.prgrms.prolog.domain.post.dto.PostResponse;
import com.prgrms.prolog.domain.post.service.PostService;
import com.prgrms.prolog.domain.post.service.PostServiceImpl;
import com.prgrms.prolog.global.jwt.JwtAuthentication;

@RestController
@RequestMapping("/api/v1/posts")
public class PostController {

private final PostService postService;
private final PostServiceImpl postService;

public PostController(PostService postService) {
public PostController(PostServiceImpl postService) {
this.postService = postService;
}

Expand All @@ -58,9 +58,11 @@ public ResponseEntity<List<PostResponse>> findAll(Pageable pageable) {
}

@PatchMapping("/{id}")
public ResponseEntity<PostResponse> update(@PathVariable Long id,
public ResponseEntity<PostResponse> update(
@PathVariable Long id,
@AuthenticationPrincipal JwtAuthentication user,
@Valid @RequestBody UpdateRequest postRequest) {
PostResponse update = postService.update(id, postRequest);
PostResponse update = postService.update(postRequest, user.id(), id);
return ResponseEntity.ok(update);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

import org.springframework.lang.Nullable;

import com.prgrms.prolog.domain.post.model.Post;
import com.prgrms.prolog.domain.user.model.User;

public class PostRequest {
public record CreateRequest(@NotBlank @Size(max = 200) String title,
@NotBlank String content,
@Nullable String tagText,
boolean openStatus) {
public static Post toEntity(CreateRequest create, User user) {
return Post.builder()
Expand All @@ -22,7 +25,7 @@ public static Post toEntity(CreateRequest create, User user) {

public record UpdateRequest(@NotBlank @Size(max = 200) String title,
@NotBlank String content,
@Nullable String tagText,
boolean openStatus) {

}
}
12 changes: 10 additions & 2 deletions src/main/java/com/prgrms/prolog/domain/post/dto/PostResponse.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.prgrms.prolog.domain.post.dto;

import static com.prgrms.prolog.domain.posttag.dto.PostTagDto.*;
import static com.prgrms.prolog.domain.user.dto.UserDto.UserProfile.*;

import java.util.List;
import java.util.Set;

import com.prgrms.prolog.domain.comment.model.Comment;
import com.prgrms.prolog.domain.post.model.Post;
Expand All @@ -12,11 +14,17 @@ public record PostResponse(String title,
String content,
boolean openStatus,
UserProfile user,
Set<String> tags,
List<Comment> comment,
int commentCount) {

public static PostResponse toPostResponse(Post post) {
return new PostResponse(post.getTitle(), post.getContent(), post.isOpenStatus(),
toUserProfile(post.getUser()), post.getComments(), post.getComments().size());
return new PostResponse(post.getTitle(),
post.getContent(),
post.isOpenStatus(),
toUserProfile(post.getUser()),
PostTagsResponse.from(post.getPostTags()).tagNames(),
post.getComments(),
post.getComments().size());
}
}
12 changes: 11 additions & 1 deletion src/main/java/com/prgrms/prolog/domain/post/model/Post.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package com.prgrms.prolog.domain.post.model;

import static javax.persistence.CascadeType.*;
import static javax.persistence.FetchType.*;
import static javax.persistence.GenerationType.*;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
Expand All @@ -20,6 +22,7 @@

import com.prgrms.prolog.domain.comment.model.Comment;
import com.prgrms.prolog.domain.post.dto.PostRequest.UpdateRequest;
import com.prgrms.prolog.domain.posttag.model.PostTag;
import com.prgrms.prolog.domain.user.model.User;
import com.prgrms.prolog.global.common.BaseEntity;

Expand Down Expand Up @@ -58,6 +61,9 @@ public class Post extends BaseEntity {
@OneToMany(mappedBy = "post")
private final List<Comment> comments = new ArrayList<>();

@OneToMany(mappedBy = "post", cascade = ALL)
private final Set<PostTag> postTags = new HashSet<>();

@Builder
public Post(String title, String content, boolean openStatus, User user) {
this.title = validateTitle(title);
Expand Down Expand Up @@ -95,6 +101,10 @@ public void changePost(UpdateRequest updateRequest) {
this.openStatus = updateRequest.openStatus();
}

public void addPostTagsFrom(List<PostTag> postTags) {
this.postTags.addAll(postTags);
}

private String validateTitle(String title) {
checkText(title);
checkOverLength(title, TITLE_MAX_SIZE);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,28 @@
package com.prgrms.prolog.domain.post.repository;

import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import com.prgrms.prolog.domain.post.model.Post;

public interface PostRepository extends JpaRepository<Post, Long> {

@Query("""
SELECT p
FROM Post p
LEFT JOIN FETCH p.comments c
where p.id = :postId
""")
Optional<Post> joinCommentFindById(@Param(value = "postId") Long postId);

@Query("""
SELECT p
FROM Post p
LEFT JOIN FETCH p.user
WHERE p.id = :postId
""")
Optional<Post> joinUserFindById(@Param(value = "postId") Long postId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,62 +2,14 @@

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.prgrms.prolog.domain.post.dto.PostRequest.CreateRequest;
import com.prgrms.prolog.domain.post.dto.PostRequest.UpdateRequest;
import com.prgrms.prolog.domain.post.dto.PostRequest;
import com.prgrms.prolog.domain.post.dto.PostResponse;
import com.prgrms.prolog.domain.post.model.Post;
import com.prgrms.prolog.domain.post.repository.PostRepository;
import com.prgrms.prolog.domain.user.model.User;
import com.prgrms.prolog.domain.user.repository.UserRepository;

@Service
@Transactional
public class PostService {

private static final String POST_NOT_EXIST_MESSAGE = "존재하지 않는 게시물입니다.";
private static final String USER_NOT_EXIST_MESSAGE = "존재하지 않는 사용자입니다.";

private final PostRepository postRepository;
private final UserRepository userRepository;

public PostService(PostRepository postRepository, UserRepository userRepository) {
this.postRepository = postRepository;
this.userRepository = userRepository;
}

public Long save(CreateRequest create, Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new IllegalArgumentException(USER_NOT_EXIST_MESSAGE));
Post post = postRepository.save(CreateRequest.toEntity(create, user));
return post.getId();
}

@Transactional(readOnly = true)
public PostResponse findById(Long id) {
return postRepository.findById(id)
.map(PostResponse::toPostResponse)
.orElseThrow(() -> new IllegalArgumentException(POST_NOT_EXIST_MESSAGE));
}

@Transactional(readOnly = true)
public Page<PostResponse> findAll(Pageable pageable) {
return postRepository.findAll(pageable)
.map(PostResponse::toPostResponse);
}

public PostResponse update(Long id, UpdateRequest update) {
Post post = postRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException(POST_NOT_EXIST_MESSAGE));
post.changePost(update);
return PostResponse.toPostResponse(post);
}

public void delete(Long id) {
Post findPost = postRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException(POST_NOT_EXIST_MESSAGE));
postRepository.delete(findPost);
}
}
public interface PostService {
public Long save(PostRequest.CreateRequest request, Long userId);
public PostResponse findById(Long postId);
public Page<PostResponse> findAll(Pageable pageable);
public PostResponse update(PostRequest.UpdateRequest update, Long userId, Long postId);
public void delete(Long id);
}
Loading

0 comments on commit db0307d

Please sign in to comment.