Skip to content

Commit

Permalink
Merge pull request #31 from kookmin-sw/BE_Feature/#25-content-and-quiz
Browse files Browse the repository at this point in the history
  • Loading branch information
wjdwlghks authored Apr 25, 2024
2 parents d4eb1d8 + 8f0472f commit 538fef0
Show file tree
Hide file tree
Showing 26 changed files with 627 additions and 12 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
Expand Up @@ -6,6 +6,7 @@
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 @@ -54,6 +55,10 @@ public class Club {
@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,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
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.project.capstone.content.controller.dto;

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

import java.util.UUID;

public record ContentResponse(
Long id,
UUID memberId,
Long bookId,
Long clubId,
ContentType type,
String title,
String body,
int likes
) {
public ContentResponse(Content content) {
this(content.getId(), content.getMember().getId(), content.getBook().getId(),
content.getClub() == null ? null : content.getClub().getId(), content.getType(), content.getTitle(), content.getBody(), content.getLikes());
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.project.capstone.content.domain;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.project.capstone.book.domain.Book;
import com.project.capstone.club.domain.Club;
import com.project.capstone.member.domain.Member;
Expand All @@ -20,21 +21,23 @@ public class Content {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String type;
@Column(name = "quiz_type")
private String quizType;
@Column(name = "quiz_answer")
private String quizAnswer;

@Enumerated(EnumType.STRING)
@Column(name = "content_type")
private ContentType type;
private String title;
private String body;
private String likes;
private int likes;

@JsonBackReference
@ManyToOne
private Member member;

@JsonBackReference
@ManyToOne
private Book book;

@JsonBackReference
@ManyToOne
private Club club;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.project.capstone.content.domain;

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

import java.util.List;
import java.util.Optional;

public interface ContentRepository extends JpaRepository<Content, Long> {
Optional<Content> findContentById(Long id);
List<Content> findContentsByType(ContentType type);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.project.capstone.content.domain;

import com.fasterxml.jackson.annotation.JsonCreator;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

@AllArgsConstructor
@Getter
@Slf4j
public enum ContentType {

Review("독후감"),
Quotation("인용구"),
ShortReview("한줄평");

private final String type;

@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static ContentType from(String type) {
for (ContentType contentType : ContentType.values()) {
if (contentType.getType().equals(type)) {
return contentType;
}
}
throw new RuntimeException("잘못된 컨텐츠 타입 입니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.project.capstone.content.exception;

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

public class ContentException extends BaseException {
public ContentException(ExceptionType exceptionType) {
super(exceptionType);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.project.capstone.content.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 ContentExceptionType implements ExceptionType {
CONTENT_NOT_FOUND(NOT_FOUND, 901, "해당 컨텐츠를 찾을 수 없습니다."),
TYPE_NOT_FOUND(NOT_FOUND, 902, "해당 타입을 찾을 수 없습니다.")
;


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;
}
}
Loading

0 comments on commit 538fef0

Please sign in to comment.