diff --git a/src/main/java/io/sparta/board/BoardApplication.java b/src/main/java/io/sparta/board/BoardApplication.java index 2b72c52..29be426 100644 --- a/src/main/java/io/sparta/board/BoardApplication.java +++ b/src/main/java/io/sparta/board/BoardApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +@EnableJpaAuditing @SpringBootApplication public class BoardApplication { @@ -11,3 +13,4 @@ public static void main(String[] args) { } } + diff --git a/src/main/java/io/sparta/board/application/service/CommentService.java b/src/main/java/io/sparta/board/application/service/CommentService.java new file mode 100644 index 0000000..4b713ea --- /dev/null +++ b/src/main/java/io/sparta/board/application/service/CommentService.java @@ -0,0 +1,16 @@ +package io.sparta.board.application.service; + +import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; +import io.sparta.board.presentation.dto.request.UpdateCommentRequestDto; +import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; +import java.util.UUID; + +public interface CommentService { + + CreateCommentResponseDto createComment(UUID postId, CreateCommentRequestDto RequestDto); + + Void updateComment(UUID commentId, UpdateCommentRequestDto RequestDto); + + Void deleteComment(UUID commentId); + +} diff --git a/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java b/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java new file mode 100644 index 0000000..4a83415 --- /dev/null +++ b/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java @@ -0,0 +1,50 @@ +package io.sparta.board.application.service; + +import io.sparta.board.exception.CustomException; +import io.sparta.board.exception.ExceptionCode; +import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.entity.Post; +import io.sparta.board.model.repository.CommentRepository; +import io.sparta.board.model.repository.PostRepository; +import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; +import io.sparta.board.presentation.dto.request.UpdateCommentRequestDto; +import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; +import io.sparta.board.presentation.mapper.CommentMapper; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class CommentServiceImpl implements CommentService { + private final CommentRepository commentRepository; + private final PostRepository postRepository; + + + @Override + public CreateCommentResponseDto createComment(UUID postid, CreateCommentRequestDto RequestDto) { + Post post = postRepository.findById(postid).orElseThrow(() -> new CustomException( + ExceptionCode.POST_NOT_FOUND)); + Comment comment = CommentMapper.createCommentRequestDtoToEntity(post, RequestDto); + commentRepository.save(comment); + return CommentMapper.entityToCreateCommentresponseDto(comment); + } + + @Override + public Void updateComment(UUID commentId, UpdateCommentRequestDto requestDto) { + Comment comment = commentRepository.findById(commentId).orElseThrow(() -> new CustomException( + ExceptionCode.COMMENT_NOT_FOUND)); + comment.update(requestDto); + return null; + } + + @Override + public Void deleteComment(UUID commentId) { + Comment comment = commentRepository.findById(commentId).orElseThrow(() -> new CustomException( + ExceptionCode.COMMENT_NOT_FOUND)); + comment.softDelete(); + return null; + } +} diff --git a/src/main/java/io/sparta/board/application/service/PostService.java b/src/main/java/io/sparta/board/application/service/PostService.java new file mode 100644 index 0000000..4567cd1 --- /dev/null +++ b/src/main/java/io/sparta/board/application/service/PostService.java @@ -0,0 +1,21 @@ +package io.sparta.board.application.service; + +import io.sparta.board.model.entity.Comment; +import io.sparta.board.presentation.dto.request.CreatePostRequestDto; +import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; +import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.response.GetPostResponseDto; +import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; +import java.util.List; +import java.util.UUID; + +public interface PostService { + + CreatePostResponseDto createPost(CreatePostRequestDto requestDto); + + UpdatePostResponseDto updatePost(UUID postId, UpdatePostRequestDto requestDto); + + Void deletePost(UUID postId); + + GetPostResponseDto getPost(UUID postId); +} diff --git a/src/main/java/io/sparta/board/application/service/PostServiceImpl.java b/src/main/java/io/sparta/board/application/service/PostServiceImpl.java new file mode 100644 index 0000000..ea384d8 --- /dev/null +++ b/src/main/java/io/sparta/board/application/service/PostServiceImpl.java @@ -0,0 +1,75 @@ +package io.sparta.board.application.service; + +import io.sparta.board.exception.CustomException; +import io.sparta.board.exception.ExceptionCode; +import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.entity.Post; +import io.sparta.board.model.repository.CommentRepository; +import io.sparta.board.model.repository.PostRepository; +import io.sparta.board.presentation.dto.CommentDto; +import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.request.CreatePostRequestDto; +import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; +import io.sparta.board.presentation.dto.response.GetPostResponseDto; +import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; +import io.sparta.board.presentation.mapper.CommentMapper; +import io.sparta.board.presentation.mapper.PostMapper; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class PostServiceImpl implements PostService { + + private final PostRepository postRepository; + private final CommentRepository commentRepository; + + @Override + public CreatePostResponseDto createPost(CreatePostRequestDto requestDto) { + //dto 로 엔티티 만들기 + Post post = PostMapper.createPostRequestDtotoEntity(requestDto); + //save + postRepository.save(post); + return PostMapper.entityToCreatePostresponseDto(post); + } + + @Override + public UpdatePostResponseDto updatePost(UUID postId, UpdatePostRequestDto requestDto) { + //id로 포스트 값 찾기 + Post post = postRepository.findById(postId).orElseThrow(() -> new CustomException( + ExceptionCode.POST_NOT_FOUND)); + post.update(requestDto); + UpdatePostResponseDto responseDto = PostMapper.entityToUpdatePostResponseDto(post); + return responseDto; + } + + @Override + public Void deletePost(UUID postId) { + Post post = postRepository.findById(postId).orElseThrow(() -> new CustomException( + ExceptionCode.POST_NOT_FOUND)); + post.softDelete(); + return null; + } + + @Override + public GetPostResponseDto getPost(UUID postId) { + Post post = postRepository.findById(postId).orElseThrow(() -> new CustomException( + ExceptionCode.POST_NOT_FOUND)); + + List comments = commentRepository.findByPost(post); + + List commentDtos = new ArrayList<>(); + for (Comment comment : comments) { + CommentDto commentDto = CommentMapper.entityToCommentDto(comment); + commentDtos.add(commentDto); + } + return PostMapper.entityToGetPostResponseDto(post, commentDtos); + } + + +} diff --git a/src/main/java/io/sparta/board/exception/ExceptionCode.java b/src/main/java/io/sparta/board/exception/ExceptionCode.java new file mode 100644 index 0000000..31a04a6 --- /dev/null +++ b/src/main/java/io/sparta/board/exception/ExceptionCode.java @@ -0,0 +1,19 @@ +package io.sparta.board.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum ExceptionCode { + + POST_NOT_FOUND(HttpStatus.NOT_FOUND, "게시글을 찾을 수 없음", 4000), + COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "댓글을 찾을 수 없음", 401); + + + private final HttpStatus httpStatus; + private final String message; + private final Integer code; + +} diff --git a/src/main/java/io/sparta/board/infrastructure/repository/JPACommentRepository.java b/src/main/java/io/sparta/board/infrastructure/repository/JPACommentRepository.java new file mode 100644 index 0000000..6eadeb6 --- /dev/null +++ b/src/main/java/io/sparta/board/infrastructure/repository/JPACommentRepository.java @@ -0,0 +1,9 @@ +package io.sparta.board.infrastructure.repository; + +import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.repository.CommentRepository; +import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface JPACommentRepository extends JpaRepository, CommentRepository { +} diff --git a/src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java b/src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java new file mode 100644 index 0000000..0ed43f9 --- /dev/null +++ b/src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java @@ -0,0 +1,10 @@ +package io.sparta.board.infrastructure.repository; + +import io.sparta.board.model.entity.Post; +import io.sparta.board.model.repository.PostRepository; +import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface JPAPostRepository extends JpaRepository , PostRepository { + +} diff --git a/src/main/java/io/sparta/board/model/entity/BaseEntity.java b/src/main/java/io/sparta/board/model/entity/BaseEntity.java new file mode 100644 index 0000000..1c09735 --- /dev/null +++ b/src/main/java/io/sparta/board/model/entity/BaseEntity.java @@ -0,0 +1,32 @@ +package io.sparta.board.model.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.SQLRestriction; +import org.hibernate.annotations.Where; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@Getter +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class BaseEntity implements Serializable { + + @CreatedDate + @Column(updatable = false) + private LocalDateTime createdAt; + + @LastModifiedDate + private LocalDateTime updatedAt; + + protected BaseEntity() { + } +} diff --git a/src/main/java/io/sparta/board/model/entity/Comment.java b/src/main/java/io/sparta/board/model/entity/Comment.java new file mode 100644 index 0000000..8018f2f --- /dev/null +++ b/src/main/java/io/sparta/board/model/entity/Comment.java @@ -0,0 +1,62 @@ +package io.sparta.board.model.entity; + +import io.sparta.board.presentation.dto.request.UpdateCommentRequestDto; +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 jakarta.persistence.Table; +import java.util.UUID; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Getter +@Table(name = "p_comment") +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Where(clause= "deleted=false") +@SQLDelete(sql = "UPDATE p_comment SET deleted=true WHERE id") +public class Comment extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "id", nullable = false) + private UUID commentId; + + @Column(nullable = false, columnDefinition = "TEXT") + private String content; + + @ManyToOne(fetch = FetchType.LAZY ) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + @Column(nullable = false) + private boolean deleted; + + @Builder + public Comment(String content, Post post) { + this.content = content; + this.post = post; + } + + public void update(UpdateCommentRequestDto requestDto) { + this.content = requestDto.getContent(); + } + + + void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public void softDelete() { + this.deleted = true; + } +} diff --git a/src/main/java/io/sparta/board/model/entity/Post.java b/src/main/java/io/sparta/board/model/entity/Post.java new file mode 100644 index 0000000..e777e0d --- /dev/null +++ b/src/main/java/io/sparta/board/model/entity/Post.java @@ -0,0 +1,66 @@ +package io.sparta.board.model.entity; + +import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.List; +import java.util.UUID; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Getter +@Entity +@Table(name = "p_post") +@SQLDelete(sql = "UPDATE p_post SET deleted=true WHERE id") +@Where(clause= "deleted=false") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Post extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "id", nullable = false) + private UUID postId; + + @Column(nullable = false, length = 100) + private String title; + + @Column(nullable = false, columnDefinition = "TEXT") + private String content; + + @OneToMany(mappedBy = "post", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) + private List comments; + + @Column(nullable = false) + private boolean deleted; + + @Builder + public Post(boolean deleted, String title, String content, List comments) { + this.title = title; + this.content = content; + this.comments = comments; + } + + public void update(UpdatePostRequestDto requestDto) { + this.title = requestDto.getTitle(); + this.content = requestDto.getContent(); + } + + public void softDelete() { + this.deleted = true; + for (Comment c : comments) { + c.setDeleted(true); + } + } + + +} diff --git a/src/main/java/io/sparta/board/model/repository/CommentRepository.java b/src/main/java/io/sparta/board/model/repository/CommentRepository.java new file mode 100644 index 0000000..a6fe42a --- /dev/null +++ b/src/main/java/io/sparta/board/model/repository/CommentRepository.java @@ -0,0 +1,16 @@ +package io.sparta.board.model.repository; + +import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.entity.Post; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface CommentRepository { + + Comment save(Comment comment); + + Optional findById(UUID id); + + List findByPost(Post post); +} diff --git a/src/main/java/io/sparta/board/model/repository/PostRepository.java b/src/main/java/io/sparta/board/model/repository/PostRepository.java new file mode 100644 index 0000000..5d8b664 --- /dev/null +++ b/src/main/java/io/sparta/board/model/repository/PostRepository.java @@ -0,0 +1,14 @@ +package io.sparta.board.model.repository; + +import io.sparta.board.model.entity.Post; +import java.util.Optional; +import java.util.UUID; + +public interface PostRepository { + + + Post save(Post post); + + Optional findById(UUID id); + +} diff --git a/src/main/java/io/sparta/board/presentation/controller/CommentController.java b/src/main/java/io/sparta/board/presentation/controller/CommentController.java new file mode 100644 index 0000000..9f978f7 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/controller/CommentController.java @@ -0,0 +1,47 @@ +package io.sparta.board.presentation.controller; + +import io.sparta.board.application.service.CommentService; +import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; +import io.sparta.board.presentation.dto.request.UpdateCommentRequestDto; +import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/comment") +public class CommentController { + + private final CommentService commentService; + //댓글생성 + @PostMapping("/{postId}") + public ResponseEntity CreateComment(@PathVariable UUID postId, @RequestBody CreateCommentRequestDto requestDto) { + CreateCommentResponseDto responseDto = commentService.createComment(postId, requestDto); + return ResponseEntity.ok(responseDto); + } + + //댓글수정 + @PatchMapping("/{commentId}") + public ResponseEntity updateComment(@PathVariable UUID commentId, @RequestBody UpdateCommentRequestDto requestDto) { + Void response = commentService.updateComment(commentId, requestDto); + return ResponseEntity.ok(response); + } + + //댓글삭제 + @DeleteMapping("/{commentId}") + public ResponseEntity deleteComment(@PathVariable UUID commentId) { + Void response = commentService.deleteComment(commentId); + return ResponseEntity.ok(response); + } + + + +} diff --git a/src/main/java/io/sparta/board/presentation/controller/PostController.java b/src/main/java/io/sparta/board/presentation/controller/PostController.java new file mode 100644 index 0000000..bc83a6a --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/controller/PostController.java @@ -0,0 +1,55 @@ +package io.sparta.board.presentation.controller; + +import io.sparta.board.application.service.PostService; +import io.sparta.board.presentation.dto.request.CreatePostRequestDto; +import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; +import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.response.GetPostResponseDto; +import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/post") +@RequiredArgsConstructor +public class PostController { + private final PostService postService; + //게시글 작성 + @PostMapping + public ResponseEntity createPost(@RequestBody CreatePostRequestDto requestDto) { + CreatePostResponseDto responseDto = postService.createPost(requestDto); + return ResponseEntity.ok(responseDto); + } + + //게시글 수정 + @PatchMapping("/{postId}") + public ResponseEntity updatePost(@PathVariable UUID postId, @RequestBody UpdatePostRequestDto requestDto) { + UpdatePostResponseDto responseDto = postService.updatePost(postId, requestDto); + return ResponseEntity.ok(responseDto); + } + + //게시글 삭제 + @DeleteMapping("/{postId}") + public ResponseEntity deletePost(@PathVariable UUID postId) { + Void response = postService.deletePost(postId); + return ResponseEntity.ok(response); + } + + //게시글 조회 + 댓글조회 + @GetMapping("/{postId}") + public ResponseEntity getPost(@PathVariable UUID postId){ + GetPostResponseDto responseDto = postService.getPost(postId); + return ResponseEntity.ok(responseDto); + } + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/CommentDto.java b/src/main/java/io/sparta/board/presentation/dto/CommentDto.java new file mode 100644 index 0000000..7995ceb --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/CommentDto.java @@ -0,0 +1,15 @@ +package io.sparta.board.presentation.dto; + +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class CommentDto { + + private UUID commentId; + private String content; + + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/request/CreateCommentRequestDto.java b/src/main/java/io/sparta/board/presentation/dto/request/CreateCommentRequestDto.java new file mode 100644 index 0000000..46e28ba --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/request/CreateCommentRequestDto.java @@ -0,0 +1,10 @@ +package io.sparta.board.presentation.dto.request; + +import lombok.Getter; + +@Getter +public class CreateCommentRequestDto { + + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/request/CreatePostRequestDto.java b/src/main/java/io/sparta/board/presentation/dto/request/CreatePostRequestDto.java new file mode 100644 index 0000000..2189392 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/request/CreatePostRequestDto.java @@ -0,0 +1,11 @@ +package io.sparta.board.presentation.dto.request; + +import lombok.Getter; + +@Getter +public class CreatePostRequestDto { + + private String title; + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/request/UpdateCommentRequestDto.java b/src/main/java/io/sparta/board/presentation/dto/request/UpdateCommentRequestDto.java new file mode 100644 index 0000000..c73eb54 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/request/UpdateCommentRequestDto.java @@ -0,0 +1,10 @@ +package io.sparta.board.presentation.dto.request; + +import lombok.Getter; + +@Getter +public class UpdateCommentRequestDto { + + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/request/UpdatePostRequestDto.java b/src/main/java/io/sparta/board/presentation/dto/request/UpdatePostRequestDto.java new file mode 100644 index 0000000..751814d --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/request/UpdatePostRequestDto.java @@ -0,0 +1,11 @@ +package io.sparta.board.presentation.dto.request; + +import lombok.Getter; + +@Getter +public class UpdatePostRequestDto { + + private String title; + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/response/CreateCommentResponseDto.java b/src/main/java/io/sparta/board/presentation/dto/response/CreateCommentResponseDto.java new file mode 100644 index 0000000..a34b358 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/response/CreateCommentResponseDto.java @@ -0,0 +1,15 @@ +package io.sparta.board.presentation.dto.response; + +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class CreateCommentResponseDto { + + private UUID commentId; + private String content; + + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/response/CreatePostResponseDto.java b/src/main/java/io/sparta/board/presentation/dto/response/CreatePostResponseDto.java new file mode 100644 index 0000000..1720a22 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/response/CreatePostResponseDto.java @@ -0,0 +1,16 @@ +package io.sparta.board.presentation.dto.response; + +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class CreatePostResponseDto { + + private UUID postId; + private String title; + private String content; + + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/response/GetPostResponseDto.java b/src/main/java/io/sparta/board/presentation/dto/response/GetPostResponseDto.java new file mode 100644 index 0000000..13734c9 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/response/GetPostResponseDto.java @@ -0,0 +1,16 @@ +package io.sparta.board.presentation.dto.response; + +import io.sparta.board.presentation.dto.CommentDto; +import java.util.List; +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class GetPostResponseDto { + private UUID postId; + private String title; + private String content; + private List comments; +} diff --git a/src/main/java/io/sparta/board/presentation/dto/response/UpdatePostResponseDto.java b/src/main/java/io/sparta/board/presentation/dto/response/UpdatePostResponseDto.java new file mode 100644 index 0000000..8d18c9a --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/response/UpdatePostResponseDto.java @@ -0,0 +1,15 @@ +package io.sparta.board.presentation.dto.response; + +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class UpdatePostResponseDto { + + private UUID postId; + private String title; + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java b/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java new file mode 100644 index 0000000..26fdc91 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java @@ -0,0 +1,36 @@ +package io.sparta.board.presentation.mapper; + +import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.entity.Post; +import io.sparta.board.presentation.dto.CommentDto; +import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; +import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; + +public class CommentMapper { + + + public static Comment createCommentRequestDtoToEntity(Post post, CreateCommentRequestDto requestDto) { + Comment comment = Comment.builder() + .post(post) + .content(requestDto.getContent()) + .build(); + return comment; + } + + public static CreateCommentResponseDto entityToCreateCommentresponseDto(Comment comment) { + CreateCommentResponseDto responseDto = CreateCommentResponseDto.builder() + .commentId(comment.getCommentId()) + .content(comment.getContent()) + .build(); + return responseDto; + } + + + public static CommentDto entityToCommentDto(Comment comment) { + CommentDto commentDto = CommentDto.builder() + .commentId(comment.getCommentId()) + .content(comment.getContent()) + .build(); + return commentDto; + } +} diff --git a/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java b/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java new file mode 100644 index 0000000..ecaa0d4 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java @@ -0,0 +1,52 @@ +package io.sparta.board.presentation.mapper; + +import io.sparta.board.model.entity.Post; +import io.sparta.board.presentation.dto.CommentDto; +import io.sparta.board.presentation.dto.request.CreatePostRequestDto; +import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.response.GetPostResponseDto; +import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; +import java.util.List; + +public class PostMapper { + + public static UpdatePostResponseDto entityToUpdatePostResponseDto(Post post) { + UpdatePostResponseDto responseDto = UpdatePostResponseDto.builder() + .postId(post.getPostId()) + .title(post.getTitle()) + .content(post.getContent()) + .build(); + return responseDto; + } + + public static Post createPostRequestDtotoEntity(CreatePostRequestDto requestDto) { + + Post post = Post.builder() + .title(requestDto.getTitle()) + .content(requestDto.getContent()) + .build(); + return post; + } + + public static CreatePostResponseDto entityToCreatePostresponseDto(Post post) { + CreatePostResponseDto responseDto = CreatePostResponseDto.builder() + .postId(post.getPostId()) + .title(post.getTitle()) + .content(post.getContent()) + .build(); + return responseDto; + } + + public static GetPostResponseDto entityToGetPostResponseDto(Post post, + List commentDtos) { + GetPostResponseDto responseDto = GetPostResponseDto.builder() + .postId(post.getPostId()) + .title(post.getTitle()) + .content(post.getContent()) + .comments(commentDtos) + .build(); + return responseDto; + } + + +} diff --git a/src/test/test.http b/src/test/test.http new file mode 100644 index 0000000..37561fc --- /dev/null +++ b/src/test/test.http @@ -0,0 +1,46 @@ +### +POST http://localhost:8080/api/post +Content-Type: application/json + +{ + "title": "test", + "content": "testtest" +} + +### +PATCH http://localhost:8080/api/post/f8ddfd86-e3cf-412f-98f6-ae4f1c631ada +Content-Type: application/json + +{ + "title": "test1", + "content": "testtest1" +} + +### +DELETE http://localhost:8080/api/post/1664236b-6901-4956-b76f-7e36c7f66755 +Content-Type: + +### +GET http://localhost:8080/api/post/2ff3779e-58c0-497c-bdf6-e32f92d23c57 +Content-Type: + +###----- + +### +POST http://localhost:8080/api/comment/1664236b-6901-4956-b76f-7e36c7f66755 +Content-Type: application/json + +{ + "content": "testtest3" +} + +### +PATCH http://localhost:8080/api/comment/0cdbc30c-0741-4a0d-bc41-6faacdd09bbf +Content-Type: application/json + +{ + "content": "testtesttest" +} + +### +DELETE http://localhost:8080/api/comment/8377beed-02b9-418b-b920-adda8146ab81 \ No newline at end of file diff --git a/to do list.md b/to do list.md new file mode 100644 index 0000000..eae88ec --- /dev/null +++ b/to do list.md @@ -0,0 +1,34 @@ +### ** to do list ** +* [x] 기본작업 + * [x] 포크받아와서 셋팅 + * [x] 엔티티 생성 + * [x] 엔티티 연관관계 생성 + * [x] jpa 리포지토리 생성 + +* [ ] 게시글 작성 + * 게시글 제목, 내용필수 + * [ ] dto 작성 + * [ ] 컨트롤러 작성 + * [ ] 서비스, jpa 메서드 작성 +* [ ] 게시글 수정 + * 제목, 내용만 수정가능 + * [ ] dto 작성 + * [ ] 엔티티에 update 메서드 추가 + * [ ] 컨트롤러 작성 + * [ ] 서비스 작성 +* [ ] 게시글 삭제 + * 삭제 시 게시글과 함께 해당 게시글의 모든 댓글도 삭제 처리 +* [ ] 게시글 단건 조회 + * 게시글에 포함된 모든 댓글목록 조회 + +* [ ] 댓글조회 +* [ ] 댓글수정 +* [ ] 댓글삭제 +* [ ] softdelete + * 삭제후 복구 불가능?? + * 삭제된 데이터는 조회 불가능 +* [ ] 작성일, 수정날짜 자동기록(베이스엔티티) +* [ ] 댓글 목록 페이징 처리 + +### ** 작업과정 ** + fatchtype.lazy -> 또 까먹음.. 다시 확인할것. \ No newline at end of file