Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/main/java/io/sparta/board/BoardApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -11,3 +13,4 @@ public static void main(String[] args) {
}

}

Original file line number Diff line number Diff line change
@@ -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);

}
Original file line number Diff line number Diff line change
@@ -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;
}
}
21 changes: 21 additions & 0 deletions src/main/java/io/sparta/board/application/service/PostService.java
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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<Comment> comments = commentRepository.findByPost(post);

List<CommentDto> commentDtos = new ArrayList<>();
for (Comment comment : comments) {
CommentDto commentDto = CommentMapper.entityToCommentDto(comment);
commentDtos.add(commentDto);
}
return PostMapper.entityToGetPostResponseDto(post, commentDtos);
}


}
19 changes: 19 additions & 0 deletions src/main/java/io/sparta/board/exception/ExceptionCode.java
Original file line number Diff line number Diff line change
@@ -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;

}
Original file line number Diff line number Diff line change
@@ -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<Comment, UUID>, CommentRepository {
}
Original file line number Diff line number Diff line change
@@ -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<Post, UUID> , PostRepository {

}
32 changes: 32 additions & 0 deletions src/main/java/io/sparta/board/model/entity/BaseEntity.java
Original file line number Diff line number Diff line change
@@ -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() {
}
}
62 changes: 62 additions & 0 deletions src/main/java/io/sparta/board/model/entity/Comment.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
66 changes: 66 additions & 0 deletions src/main/java/io/sparta/board/model/entity/Post.java
Original file line number Diff line number Diff line change
@@ -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<Comment> comments;

@Column(nullable = false)
private boolean deleted;

@Builder
public Post(boolean deleted, String title, String content, List<Comment> 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);
}
}


}
Loading