Skip to content

Commit

Permalink
#25 feat: quiz 생성, 조회
Browse files Browse the repository at this point in the history
  • Loading branch information
wjdwlghks committed Apr 25, 2024
1 parent 86820cd commit 8f0472f
Show file tree
Hide file tree
Showing 11 changed files with 229 additions and 4 deletions.
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 @@ -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 @@ -55,8 +56,12 @@ public class Member {
@OneToMany(mappedBy = "member")
private List<Content> contents = new ArrayList<>();

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

public Member(SignupRequest request) {
this(null, request.email(), request.name(), request.age(), request.gender(), null,
new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.project.capstone.quiz.controller;


import com.project.capstone.auth.domain.PrincipalDetails;
import com.project.capstone.quiz.controller.dto.CreateQuizRequest;
import com.project.capstone.quiz.controller.dto.QuizResponse;
import com.project.capstone.quiz.service.QuizService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/quiz")
public class QuizController {
private final QuizService quizService;

// 퀴즈 생성
@PostMapping("/create")
public ResponseEntity<?> createQuiz(@AuthenticationPrincipal PrincipalDetails details,
@RequestBody CreateQuizRequest request,
@RequestParam Long bookId, @RequestParam(required = false) Long clubId) {
quizService.createQuiz(details.getUserId(), request, bookId, clubId);
return ResponseEntity.ok().body("퀴즈 생성 완료");
}

// 단건 조회
@GetMapping("/{id}")
public ResponseEntity<QuizResponse> getQuiz(@PathVariable Long id) {
QuizResponse quizResponse = quizService.getQuiz(id);
return ResponseEntity.ok().body(quizResponse);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.project.capstone.quiz.controller.dto;

import com.project.capstone.quiz.domain.QuizType;

public record CreateQuizRequest(
QuizType type,
String description,
String answer,
String example1,
String example2,
String example3,
String example4
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.project.capstone.quiz.controller.dto;

import com.project.capstone.quiz.domain.Quiz;
import com.project.capstone.quiz.domain.QuizType;

import java.util.UUID;

public record QuizResponse (
Long id,
UUID memberId,
Long bookId,
Long clubId,
QuizType type,
String description,
String answer,
String example1,
String example2,
String example3,
String example4
) {
public QuizResponse(Quiz quiz) {
this(quiz.getId(), quiz.getMember().getId(), quiz.getBook().getId(), quiz.getClub() == null ? null : quiz.getClub().getId(), quiz.getType(),
quiz.getDescription(), quiz.getAnswer(), quiz.getExample1(), quiz.getExample2(), quiz.getExample3(), quiz.getExample4());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ public class Quiz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Enumerated(EnumType.STRING)
private QuizType type;
private String description;
private String answer;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.project.capstone.quiz.domain;

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

import java.util.Optional;

public interface QuizRepository extends JpaRepository<Quiz, Long> {
Optional<Quiz> findQuizById(Long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@
@AllArgsConstructor
@Getter
public enum QuizType {
Multiple_Choice("객관식"),
Short_Answer("단답식"),
MultipleChoice("객관식"),
ShortAnswer("단답식"),
OX("OX")
;

private final String type;

@JsonCreator
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static QuizType from(String type) {
for (QuizType quizType : QuizType.values()) {
if (quizType.getType().equals(type)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.project.capstone.quiz.exception;

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

public class QuizException extends BaseException {
public QuizException(ExceptionType exceptionType) {
super(exceptionType);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.project.capstone.quiz.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 QuizExceptionType implements ExceptionType {
QUIZ_NOT_FOUND(NOT_FOUND, 701, "해당 퀴즈를 찾을 수 없습니다.")
;

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,89 @@
package com.project.capstone.quiz.service;

import com.project.capstone.book.domain.Book;
import com.project.capstone.book.domain.BookRepository;
import com.project.capstone.book.exception.BookException;
import com.project.capstone.book.exception.BookExceptionType;
import com.project.capstone.club.domain.Club;
import com.project.capstone.club.domain.ClubRepository;
import com.project.capstone.club.exception.ClubException;
import com.project.capstone.club.exception.ClubExceptionType;
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.member.exception.MemberExceptionType;
import com.project.capstone.quiz.controller.dto.CreateQuizRequest;
import com.project.capstone.quiz.controller.dto.QuizResponse;
import com.project.capstone.quiz.domain.Quiz;
import com.project.capstone.quiz.domain.QuizRepository;
import com.project.capstone.quiz.exception.QuizException;
import com.project.capstone.quiz.exception.QuizExceptionType;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.UUID;

import static com.project.capstone.book.exception.BookExceptionType.BOOK_NOT_FOUND;
import static com.project.capstone.club.exception.ClubExceptionType.CLUB_NOT_FOUND;
import static com.project.capstone.member.exception.MemberExceptionType.MEMBER_NOT_FOUND;
import static com.project.capstone.quiz.exception.QuizExceptionType.QUIZ_NOT_FOUND;

@RequiredArgsConstructor
@Service
@Slf4j
public class QuizService {

private final QuizRepository quizRepository;
private final MemberRepository memberRepository;
private final BookRepository bookRepository;
private final ClubRepository clubRepository;

public void createQuiz(String userId, CreateQuizRequest request, Long bookId, Long clubId) {
Member member = memberRepository.findMemberById(UUID.fromString(userId)).orElseThrow(
() -> new MemberException(MEMBER_NOT_FOUND)
);

Book book = bookRepository.findBookById(bookId).orElseThrow(
() -> new BookException(BOOK_NOT_FOUND)
);
Club club;
if (clubId == null) {
club = null;
}
else {
club = clubRepository.findClubById(clubId).orElseThrow(
()-> new ClubException(CLUB_NOT_FOUND)
);
}

Quiz saved = quizRepository.save(
Quiz.builder()
.type(request.type())
.description(request.description())
.answer(request.answer())
.example1(request.example1())
.example2(request.example2())
.example3(request.example3())
.example4(request.example4())
.member(member)
.book(book)
.club(club)
.build()
);

member.getQuizzes().add(saved);
book.getQuizzes().add(saved);
if (club != null) {
club.getQuizzes().add(saved);
}
}


public QuizResponse getQuiz(Long id) {
Quiz quiz = quizRepository.findQuizById(id).orElseThrow(
() -> new QuizException(QUIZ_NOT_FOUND)
);
return new QuizResponse(quiz);
}
}

0 comments on commit 8f0472f

Please sign in to comment.