Skip to content

Commit

Permalink
Merge pull request #34 from kookmin-sw/BE
Browse files Browse the repository at this point in the history
  • Loading branch information
wjdwlghks authored Apr 26, 2024
2 parents e5bfc48 + 538fef0 commit 7c8596b
Show file tree
Hide file tree
Showing 46 changed files with 1,026 additions and 16 deletions.
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

0 comments on commit 7c8596b

Please sign in to comment.