diff --git a/src/main/java/com/on/server/domain/board/domain/Board.java b/src/main/java/com/on/server/domain/board/domain/Board.java index 461693aa..aca4221f 100644 --- a/src/main/java/com/on/server/domain/board/domain/Board.java +++ b/src/main/java/com/on/server/domain/board/domain/Board.java @@ -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 posts = new ArrayList<>(); + } + diff --git a/src/main/java/com/on/server/domain/board/domain/BoardType.java b/src/main/java/com/on/server/domain/board/domain/BoardType.java new file mode 100644 index 00000000..350c3c9f --- /dev/null +++ b/src/main/java/com/on/server/domain/board/domain/BoardType.java @@ -0,0 +1,6 @@ +package com.on.server.domain.board.domain; + +public enum BoardType { + INFO, // 정보게시판 + FREE // 자유게시판 +} diff --git a/src/main/java/com/on/server/domain/board/domain/repository/BoardRepository.java b/src/main/java/com/on/server/domain/board/domain/repository/BoardRepository.java index ed431be3..c680543f 100644 --- a/src/main/java/com/on/server/domain/board/domain/repository/BoardRepository.java +++ b/src/main/java/com/on/server/domain/board/domain/repository/BoardRepository.java @@ -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 { +import java.util.Optional; +public interface BoardRepository extends JpaRepository { + Optional findByType(BoardType type); } diff --git a/src/main/java/com/on/server/domain/board/dto/BoardDTO.java b/src/main/java/com/on/server/domain/board/dto/BoardDTO.java index a3cc9ad3..ed693c25 100644 --- a/src/main/java/com/on/server/domain/board/dto/BoardDTO.java +++ b/src/main/java/com/on/server/domain/board/dto/BoardDTO.java @@ -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; @@ -10,6 +11,6 @@ public class BoardDTO { // 게시판 ID private Long boardId; - // 게시판 이름 - private String name; + // 게시판 타입 + private BoardType type; } diff --git a/src/main/java/com/on/server/domain/post/application/PostService.java b/src/main/java/com/on/server/domain/post/application/PostService.java index a2180e59..4c8dc8cf 100644 --- a/src/main/java/com/on/server/domain/post/application/PostService.java +++ b/src/main/java/com/on/server/domain/post/application/PostService.java @@ -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; @@ -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; @@ -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 getAllPostsByBoardId(Long boardId) { - return null; + public List 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 getPostsByUserIdAndBoardId(Long userId, Long boardId) { - return null; + public List getPostsByUserIdAndBoardType(Long userId, BoardType boardType) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); + Board board = boardRepository.findByType(boardType) + .orElseThrow(() -> new RuntimeException("게시판을 찾을 수 없습니다.")); + + List 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(); + } +} diff --git a/src/main/java/com/on/server/domain/post/domain/repository/PostRepository.java b/src/main/java/com/on/server/domain/post/domain/repository/PostRepository.java index 1491a258..e5f86a5a 100644 --- a/src/main/java/com/on/server/domain/post/domain/repository/PostRepository.java +++ b/src/main/java/com/on/server/domain/post/domain/repository/PostRepository.java @@ -8,7 +8,6 @@ import java.util.List; public interface PostRepository extends JpaRepository { - List findByBoard(Board board); - List findByUser(User user); + List findByUserAndBoard(User user, Board board); } diff --git a/src/main/java/com/on/server/domain/post/dto/PostResponseDTO.java b/src/main/java/com/on/server/domain/post/dto/PostResponseDTO.java index 113684a0..0504d3bf 100644 --- a/src/main/java/com/on/server/domain/post/dto/PostResponseDTO.java +++ b/src/main/java/com/on/server/domain/post/dto/PostResponseDTO.java @@ -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; @@ -13,12 +14,12 @@ @NoArgsConstructor public class PostResponseDTO { + // 게시판 타입 + private BoardType boardType; + // 게시글 ID private Long postId; - // 게시판 ID - private Long boardId; - // 작성자 ID private Long userId; diff --git a/src/main/java/com/on/server/domain/post/presentation/PostController.java b/src/main/java/com/on/server/domain/post/presentation/PostController.java index 0f8ffbb0..940f22ab 100644 --- a/src/main/java/com/on/server/domain/post/presentation/PostController.java +++ b/src/main/java/com/on/server/domain/post/presentation/PostController.java @@ -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; @@ -20,61 +21,55 @@ public class PostController { private final PostService postService; - // 1. 특정 게시판(boardId)의 모든 게시글을 조회 + // 1. 특정 게시판(boardType)의 모든 게시글을 조회 @Operation(summary = "특정 게시판의 모든 게시글 조회") - @GetMapping("/{boardId}") - public ResponseEntity> getAllPostsByBoardId(@PathVariable Long boardId) { - - // PostService를 호출하여 특정 boardId에 해당하는 게시글 목록을 가져옴 - List posts = postService.getAllPostsByBoardId(boardId); + @GetMapping("/{boardType}") + public ResponseEntity> getAllPostsByBoardType(@PathVariable BoardType boardType) { + // PostService를 호출하여 특정 boardType에 해당하는 게시글 목록을 가져옴 + List posts = postService.getAllPostsByBoardType(boardType); // 조회된 게시글 목록을 응답 본문에 담아 HTTP 200 OK 상태와 함께 반환 return ResponseEntity.ok(posts); } - // 2. 특정 게시판(boardId)에 새로운 게시글을 작성 - @PostMapping("/{boardId}") + // 2. 특정 게시판(boardType)에 새로운 게시글을 작성 @Operation(summary = "특정 게시판에 새로운 게시글 작성") - public ResponseEntity createPost(@PathVariable Long boardId, @RequestBody PostRequestDTO postRequestDTO) { - + @PostMapping("/{boardType}") + public ResponseEntity 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 getPostById(@PathVariable Long boardId, @PathVariable Long postId) { - - // PostService를 호출하여 특정 boardId와 postId에 해당하는 게시글을 가져옴 - PostResponseDTO post = postService.getPostById(boardId, postId); + @GetMapping("/{boardType}/{postId}") + public ResponseEntity 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> getPostsByUserIdAndBoardId(@PathVariable Long userId, @PathVariable Long boardId) { - - List posts = postService.getPostsByUserIdAndBoardId(userId, boardId); + @GetMapping("/user/{userId}/{boardType}") + public ResponseEntity> getPostsByUserIdAndBoardType(@PathVariable Long userId, @PathVariable BoardType boardType) { + List posts = postService.getPostsByUserIdAndBoardType(userId, boardType); return ResponseEntity.ok(posts); } - // 4. 자기가 특정 게시판에 작성한 특정 게시글(postId)을 삭제 - @DeleteMapping("/user/{userId}/{boardId}/{postId}") + // 5. 자기가 특정 게시판에 작성한 특정 게시글(postId)을 삭제 @Operation(summary = "사용자가 특정 게시판에 작성한 특정 게시글 삭제") - public ResponseEntity 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 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(); } - }