Skip to content

Commit

Permalink
feat: PostService 구현 및 dto/controller 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
isuHan committed Aug 9, 2024
1 parent 9de6186 commit 830f7a5
Show file tree
Hide file tree
Showing 8 changed files with 111 additions and 51 deletions.
7 changes: 5 additions & 2 deletions src/main/java/com/on/server/domain/board/domain/Board.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@
@Table(name = "board")
public class Board extends BaseEntity {

@Column(name = "name", nullable = false)
private String name;
@Enumerated(EnumType.STRING)
@Column(name = "type", nullable = false, unique = true)
private BoardType type;

@OneToMany(mappedBy = "board", cascade = CascadeType.ALL)
private List<Post> posts = new ArrayList<>();

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.on.server.domain.board.domain;

public enum BoardType {
INFO, // 정보게시판
FREE // 자유게시판
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.on.server.domain.board.domain.repository;

import com.on.server.domain.board.domain.Board;
import com.on.server.domain.board.domain.BoardType;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {
import java.util.Optional;

public interface BoardRepository extends JpaRepository<Board, Long> {
Optional<Board> findByType(BoardType type);
}
5 changes: 3 additions & 2 deletions src/main/java/com/on/server/domain/board/dto/BoardDTO.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.on.server.domain.board.dto;

import com.on.server.domain.board.domain.BoardType;
import lombok.Getter;
import lombok.NoArgsConstructor;

Expand All @@ -10,6 +11,6 @@ public class BoardDTO {
// 게시판 ID
private Long boardId;

// 게시판 이름
private String name;
// 게시판 타입
private BoardType type;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.on.server.domain.post.application;

import com.on.server.domain.board.domain.Board;
import com.on.server.domain.board.domain.BoardType;
import com.on.server.domain.board.domain.repository.BoardRepository;
import com.on.server.domain.post.domain.Post;
import com.on.server.domain.post.domain.repository.PostRepository;
Expand All @@ -9,7 +10,6 @@
import com.on.server.domain.user.domain.User;
import com.on.server.domain.user.domain.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -24,35 +24,87 @@ public class PostService {
private final PostRepository postRepository;
private final UserRepository userRepository;
private final BoardRepository boardRepository;
// private final ImageRepository imageRepository;


// 1. 특정 게시판의 모든 게시글 조회
@Transactional(readOnly = true)
public List<PostResponseDTO> getAllPostsByBoardId(Long boardId) {
return null;
public List<PostResponseDTO> getAllPostsByBoardType(BoardType boardType) {
Board board = boardRepository.findByType(boardType)
.orElseThrow(() -> new RuntimeException("게시판을 찾을 수 없습니다."));
return board.getPosts().stream()
.map(this::mapToPostResponseDTO)
.collect(Collectors.toList());
}

// 2. 특정 게시판에 새로운 게시글 작성
public PostResponseDTO createPost(Long boardId, PostRequestDTO postRequestDTO) {
return null;
public PostResponseDTO createPost(BoardType boardType, PostRequestDTO postRequestDTO) {
User user = userRepository.findById(postRequestDTO.getUserId())
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다."));
Board board = boardRepository.findByType(boardType)
.orElseThrow(() -> new RuntimeException("게시판을 찾을 수 없습니다."));

Post post = Post.builder()
.title(postRequestDTO.getTitle())
.content(postRequestDTO.getContent())
.isAnonymous(postRequestDTO.isAnonymous())
.isAnonymousUniv(postRequestDTO.isAnonymousUniv())
.board(board)
.user(user)
.build();

postRepository.save(post);

return mapToPostResponseDTO(post);
}

// 3. 특정 게시글 조회
@Transactional(readOnly = true)
public PostResponseDTO getPostById(Long boardId, Long postId) {
return null;
public PostResponseDTO getPostById(BoardType boardType, Long postId) {
Post post = postRepository.findById(postId)
.orElseThrow(() -> new RuntimeException("게시글을 찾을 수 없습니다."));
if (!post.getBoard().getType().equals(boardType)) {
throw new RuntimeException("해당 게시판에 게시글이 존재하지 않습니다.");
}
return mapToPostResponseDTO(post);
}

// 4. 특정 사용자가 특정 게시판에 작성한 모든 게시글 조회
@Transactional(readOnly = true)
public List<PostResponseDTO> getPostsByUserIdAndBoardId(Long userId, Long boardId) {
return null;
public List<PostResponseDTO> getPostsByUserIdAndBoardType(Long userId, BoardType boardType) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다."));
Board board = boardRepository.findByType(boardType)
.orElseThrow(() -> new RuntimeException("게시판을 찾을 수 없습니다."));

List<Post> posts = postRepository.findByUserAndBoard(user, board);
return posts.stream()
.map(this::mapToPostResponseDTO)
.collect(Collectors.toList());
}

// 5. 특정 게시글 삭제
public void deletePost(Long userId, Long boardId, Long postId) {
public void deletePost(Long userId, BoardType boardType, Long postId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다."));
Post post = postRepository.findById(postId)
.orElseThrow(() -> new RuntimeException("게시글을 찾을 수 없습니다."));

if (!post.getUser().getId().equals(userId) || !post.getBoard().getType().equals(boardType)) {
throw new RuntimeException("해당 게시판에 게시글이 존재하지 않습니다.");
}

postRepository.delete(post);
}
}

// Post 엔티티를 PostResponseDTO로 매핑하는 메서드
private PostResponseDTO mapToPostResponseDTO(Post post) {
return PostResponseDTO.builder()
.postId(post.getId())
.boardType(post.getBoard().getType())
.userId(post.getUser().getId())
.title(post.getTitle())
.content(post.getContent())
.isAnonymous(post.getIsAnonymous())
.isAnonymousUniv(post.getIsAnonymousUniv())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import java.util.List;

public interface PostRepository extends JpaRepository<Post, Long> {
List<Post> findByBoard(Board board);
List<Post> findByUser(User user);

List<Post> findByUserAndBoard(User user, Board board);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.on.server.domain.post.dto;

import com.on.server.domain.board.domain.BoardType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -13,12 +14,12 @@
@NoArgsConstructor
public class PostResponseDTO {

// 게시판 타입
private BoardType boardType;

// 게시글 ID
private Long postId;

// 게시판 ID
private Long boardId;

// 작성자 ID
private Long userId;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.on.server.domain.post.application.PostService;
import com.on.server.domain.post.dto.PostRequestDTO;
import com.on.server.domain.post.dto.PostResponseDTO;
import com.on.server.domain.board.domain.BoardType;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
Expand All @@ -20,61 +21,55 @@ public class PostController {

private final PostService postService;

// 1. 특정 게시판(boardId)의 모든 게시글을 조회
// 1. 특정 게시판(boardType)의 모든 게시글을 조회
@Operation(summary = "특정 게시판의 모든 게시글 조회")
@GetMapping("/{boardId}")
public ResponseEntity<List<PostResponseDTO>> getAllPostsByBoardId(@PathVariable Long boardId) {

// PostService를 호출하여 특정 boardId에 해당하는 게시글 목록을 가져옴
List<PostResponseDTO> posts = postService.getAllPostsByBoardId(boardId);
@GetMapping("/{boardType}")
public ResponseEntity<List<PostResponseDTO>> getAllPostsByBoardType(@PathVariable BoardType boardType) {
// PostService를 호출하여 특정 boardType에 해당하는 게시글 목록을 가져옴
List<PostResponseDTO> posts = postService.getAllPostsByBoardType(boardType);

// 조회된 게시글 목록을 응답 본문에 담아 HTTP 200 OK 상태와 함께 반환
return ResponseEntity.ok(posts);
}

// 2. 특정 게시판(boardId)에 새로운 게시글을 작성
@PostMapping("/{boardId}")
// 2. 특정 게시판(boardType)에 새로운 게시글을 작성
@Operation(summary = "특정 게시판에 새로운 게시글 작성")
public ResponseEntity<PostResponseDTO> createPost(@PathVariable Long boardId, @RequestBody PostRequestDTO postRequestDTO) {

@PostMapping("/{boardType}")
public ResponseEntity<PostResponseDTO> createPost(@PathVariable BoardType boardType, @RequestBody PostRequestDTO postRequestDTO) {
// PostService를 호출하여 새로운 게시글을 생성
PostResponseDTO createdPost = postService.createPost(boardId, postRequestDTO);
PostResponseDTO createdPost = postService.createPost(boardType, postRequestDTO);

// 생성된 게시글을 응답 본문에 담아 HTTP 201 Created 상태와 함께 반환
return ResponseEntity.status(HttpStatus.CREATED).body(createdPost);
}

// 3. 특정 게시판(boardId) 내의 특정 게시글(postId)을 조회
@GetMapping("/{boardId}/{postId}")
// 3. 특정 게시판(boardType) 내의 특정 게시글(postId)을 조회
@Operation(summary = "특정 게시판 내의 특정 게시글 조회")
public ResponseEntity<PostResponseDTO> getPostById(@PathVariable Long boardId, @PathVariable Long postId) {

// PostService를 호출하여 특정 boardId와 postId에 해당하는 게시글을 가져옴
PostResponseDTO post = postService.getPostById(boardId, postId);
@GetMapping("/{boardType}/{postId}")
public ResponseEntity<PostResponseDTO> getPostById(@PathVariable BoardType boardType, @PathVariable Long postId) {
// PostService를 호출하여 특정 boardType과 postId에 해당하는 게시글을 가져옴
PostResponseDTO post = postService.getPostById(boardType, postId);

// 조회된 게시글을 응답 본문에 담아 HTTP 200 OK 상태와 함께 반환
return ResponseEntity.ok(post);
}

// 4. 자기가 특정 게시판에 작성한 모든 게시글 조회
@GetMapping("/user/{userId}/{boardId}")
@Operation(summary = "사용자가 특정 게시판에 작성한 모든 게시글 조회")
public ResponseEntity<List<PostResponseDTO>> getPostsByUserIdAndBoardId(@PathVariable Long userId, @PathVariable Long boardId) {

List<PostResponseDTO> posts = postService.getPostsByUserIdAndBoardId(userId, boardId);
@GetMapping("/user/{userId}/{boardType}")
public ResponseEntity<List<PostResponseDTO>> getPostsByUserIdAndBoardType(@PathVariable Long userId, @PathVariable BoardType boardType) {
List<PostResponseDTO> posts = postService.getPostsByUserIdAndBoardType(userId, boardType);
return ResponseEntity.ok(posts);
}

// 4. 자기가 특정 게시판에 작성한 특정 게시글(postId)을 삭제
@DeleteMapping("/user/{userId}/{boardId}/{postId}")
// 5. 자기가 특정 게시판에 작성한 특정 게시글(postId)을 삭제
@Operation(summary = "사용자가 특정 게시판에 작성한 특정 게시글 삭제")
public ResponseEntity<Void> deletePost(@PathVariable Long userId, @PathVariable Long boardId, @PathVariable Long postId) {

// PostService를 호출하여 특정 boardId, postId 및 userId에 해당하는 게시글을 삭제
postService.deletePost(userId, boardId, postId);
@DeleteMapping("/user/{userId}/{boardType}/{postId}")
public ResponseEntity<Void> deletePost(@PathVariable Long userId, @PathVariable BoardType boardType, @PathVariable Long postId) {
// PostService를 호출하여 특정 boardType, postId 및 userId에 해당하는 게시글을 삭제
postService.deletePost(userId, boardType, postId);

// HTTP 204 No Content 상태를 반환하여 성공적으로 삭제되었음을 알림
return ResponseEntity.noContent().build();
}

}

0 comments on commit 830f7a5

Please sign in to comment.