Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BE #18 #22 #25 #34

Merged
merged 9 commits into from
Apr 26, 2024
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.project.capstone.book.domain;

import com.project.capstone.club.domain.Club;
import com.project.capstone.content.domain.Content;
import com.project.capstone.quiz.domain.Quiz;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down Expand Up @@ -32,4 +34,10 @@ public class Book {

@OneToMany(mappedBy = "book")
private List<Club> clubs = new ArrayList<>();

@OneToMany(mappedBy = "book")
private List<Content> contents = new ArrayList<>();

@OneToMany(mappedBy = "book")
private List<Quiz> quizzes = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.project.capstone.book.domain;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface BookRepository extends JpaRepository<Book, Long> {
Optional<Book> findBookById(Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.project.capstone.book.exception;

import com.project.capstone.common.exception.BaseException;
import com.project.capstone.common.exception.ExceptionType;

public class BookException extends BaseException {
public BookException(ExceptionType exceptionType) {
super(exceptionType);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.project.capstone.book.exception;

import com.project.capstone.common.exception.ExceptionType;
import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;

import static org.springframework.http.HttpStatus.NOT_FOUND;

@AllArgsConstructor
public enum BookExceptionType implements ExceptionType {

BOOK_NOT_FOUND(NOT_FOUND, 801, "해당 책을 찾을 수 없습니다.")
;

private final HttpStatus status;
private final int exceptionCode;
private final String message;

@Override
public HttpStatus httpStatus() {
return status;
}

@Override
public int exceptionCode() {
return exceptionCode;
}

@Override
public String message() {
return message;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.project.capstone.club.controller.dto;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.project.capstone.club.domain.Club;
import com.project.capstone.club.domain.PublicStatus;
import com.project.capstone.post.domain.Post;

import java.time.LocalDateTime;
import java.util.List;

public record ClubResponse (
Long id,
Expand All @@ -12,9 +15,11 @@ public record ClubResponse (
String name,
LocalDateTime createdAt,
int maximum,
PublicStatus publicstatus
PublicStatus publicstatus,
List<Post> posts

) {
public ClubResponse(Club club) {
this(club.getId(), club.getBook() == null ? null : club.getBook().getId(), club.getTopic(), club.getName(), club.getCreatedAt(), club.getMaximum(), club.getPublicStatus());
this(club.getId(), club.getBook() == null ? null : club.getBook().getId(), club.getTopic(), club.getName(), club.getCreatedAt(), club.getMaximum(), club.getPublicStatus(), club.getPosts());
}
}
10 changes: 10 additions & 0 deletions backend/src/main/java/com/project/capstone/club/domain/Club.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.project.capstone.club.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.project.capstone.book.domain.Book;
import com.project.capstone.memberclub.domain.MemberClub;
import com.project.capstone.content.domain.Content;
import com.project.capstone.post.domain.Post;
import com.project.capstone.quiz.domain.Quiz;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down Expand Up @@ -40,15 +43,22 @@ public class Club {
private PublicStatus publicStatus;
private Integer password;

@JsonManagedReference
@OneToMany(mappedBy = "club")
private List<Post> posts = new ArrayList<>();

@JsonManagedReference
@OneToMany(mappedBy = "club")
private List<MemberClub> members = new ArrayList<>();

@JsonManagedReference
@OneToMany(mappedBy = "club")
private List<Content> contents = new ArrayList<>();

@JsonManagedReference
@OneToMany(mappedBy = "club")
private List<Quiz> quizzes = new ArrayList<>();

@ManyToOne
private Book book;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public enum PublicStatus {
private final String description;


@JsonCreator
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static PublicStatus from(String status) {
for (PublicStatus publicStatus : PublicStatus.values()) {
if (publicStatus.getDescription().equals(status)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.project.capstone.comment.controller;

import com.project.capstone.auth.domain.PrincipalDetails;
import com.project.capstone.comment.controller.dto.CommentResponse;
import com.project.capstone.comment.controller.dto.CreateCommentRequest;
import com.project.capstone.comment.service.CommentService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/comment")
public class CommentController {

private final CommentService commentService;

@PostMapping("create")
public ResponseEntity<?> createComment(@AuthenticationPrincipal PrincipalDetails details,
@RequestParam Long postId, @RequestBody CreateCommentRequest request) {
commentService.createPost(details.getUserId(), postId, request);
return ResponseEntity.ok().body("댓글 생성 완료");
}

@GetMapping("/{id}")
public ResponseEntity<?> getComment(@AuthenticationPrincipal PrincipalDetails details,
@PathVariable Long id) {
CommentResponse commentResponse = commentService.getComment(details.getUserId(), id);
return ResponseEntity.ok().body(commentResponse);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.project.capstone.comment.controller.dto;

import com.project.capstone.comment.domain.Comment;

import java.time.LocalDateTime;
import java.util.UUID;

public record CommentResponse(
Long id,
Long postId,
UUID memberId,
String body,
LocalDateTime createdAt
) {
public CommentResponse(Comment comment) {
this(comment.getId(), comment.getPost().getId(), comment.getMember().getId(), comment.getBody(), comment.getCreatedAt());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.project.capstone.comment.controller.dto;

public record CreateCommentRequest (
String body
) {
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.project.capstone.comment.domain;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.project.capstone.member.domain.Member;
import com.project.capstone.post.domain.Post;
import jakarta.persistence.*;
Expand Down Expand Up @@ -27,9 +28,11 @@ public class Comment {
@Column(name = "created_at")
private LocalDateTime createdAt;

@JsonBackReference
@ManyToOne
private Member member;

@JsonBackReference
@ManyToOne
private Post post;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.project.capstone.comment.domain;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface CommentRepository extends JpaRepository<Comment, Long> {
Optional<Comment> findCommentById(Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.project.capstone.comment.exception;

import com.project.capstone.common.exception.BaseException;
import com.project.capstone.common.exception.ExceptionType;

public class CommentException extends BaseException {
public CommentException(ExceptionType exceptionType) {
super(exceptionType);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.project.capstone.comment.exception;

import com.project.capstone.common.exception.ExceptionType;
import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;

import static org.springframework.http.HttpStatus.NOT_FOUND;

@AllArgsConstructor
public enum CommentExceptionType implements ExceptionType {
COMMENT_NOT_FOUND(NOT_FOUND, 501, "해당 댓글을 찾을 수 없습니다.");
;

private final HttpStatus status;
private final int exceptionCode;
private final String message;

@Override
public HttpStatus httpStatus() {
return status;
}

@Override
public int exceptionCode() {
return exceptionCode;
}

@Override
public String message() {
return message;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.project.capstone.comment.service;

import com.project.capstone.comment.controller.dto.CommentResponse;
import com.project.capstone.comment.controller.dto.CreateCommentRequest;
import com.project.capstone.comment.domain.Comment;
import com.project.capstone.comment.domain.CommentRepository;
import com.project.capstone.comment.exception.CommentException;
import com.project.capstone.member.domain.Member;
import com.project.capstone.member.domain.MemberRepository;
import com.project.capstone.member.exception.MemberException;
import com.project.capstone.post.domain.Post;
import com.project.capstone.post.domain.PostRepository;
import com.project.capstone.post.exception.PostException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.UUID;

import static com.project.capstone.comment.exception.CommentExceptionType.COMMENT_NOT_FOUND;
import static com.project.capstone.member.exception.MemberExceptionType.MEMBER_NOT_FOUND;
import static com.project.capstone.post.exception.PostExceptionType.POST_NOT_FOUND;

@Service
@RequiredArgsConstructor
@Slf4j
public class CommentService {

private final CommentRepository commentRepository;
private final MemberRepository memberRepository;
private final PostRepository postRepository;

public void createPost(String userId, Long postId, CreateCommentRequest request) {
Member member = memberRepository.findMemberById(UUID.fromString(userId)).orElseThrow(
() -> new MemberException(MEMBER_NOT_FOUND)
);

Post post = postRepository.findPostById(postId).orElseThrow(
() -> new PostException(POST_NOT_FOUND)
);

Comment saved = commentRepository.save(Comment.builder()
.body(request.body())
.member(member)
.post(post)
.build());

member.getComments().add(saved);
post.getComments().add(saved);
}


public CommentResponse getComment(String userId, Long id) {
if (memberRepository.findMemberById(UUID.fromString(userId)).isEmpty()) {
throw new MemberException(MEMBER_NOT_FOUND);
}
Comment comment = commentRepository.findCommentById(id).orElseThrow(
() -> new CommentException(COMMENT_NOT_FOUND)
);
return new CommentResponse(comment);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.project.capstone.content.controller;

import com.project.capstone.auth.domain.PrincipalDetails;
import com.project.capstone.content.controller.dto.ContentCreateRequest;
import com.project.capstone.content.controller.dto.ContentResponse;
import com.project.capstone.content.service.ContentService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/content")
public class ContentController {

private final ContentService contentService;

// 컨텐츠 생성
@PostMapping("/create")
public ResponseEntity<?> createContent(@AuthenticationPrincipal PrincipalDetails details,
@RequestBody ContentCreateRequest request,
@RequestParam Long bookId, @RequestParam(required = false) Long clubId) {
contentService.createContent(details.getUserId(), request, bookId, clubId);
return ResponseEntity.ok().body("컨텐츠 생성 완료");
}

// 단일 컨텐츠 조회
@GetMapping("/{id}")
public ResponseEntity<ContentResponse> getContent(@PathVariable Long id) {
ContentResponse contentResponse = contentService.getContent(id);
return ResponseEntity.ok().body(contentResponse);
}

// 컨텐츠 종류별 조회
@GetMapping("/get")
public ResponseEntity<List<ContentResponse>> getContents(@RequestParam String type) {
List<ContentResponse> contentResponseList = contentService.getContents(type);
return ResponseEntity.ok().body(contentResponseList);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.project.capstone.content.controller.dto;

import com.project.capstone.content.domain.ContentType;

public record ContentCreateRequest(
ContentType contentType,
String title,
String body
) {
}
Loading