Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 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
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,9 @@ public void gameStart(Long roomId, UserPrincipal principal) {
timerService.startTimer(room, START_DELAY);

messageSender.sendBroadcast(
destination, MessageType.GAME_START, toGameStartResponse(questions));
destination,
MessageType.GAME_START,
toGameStartResponse(quiz.getQuizType(), questions));
messageSender.sendBroadcast(
destination, MessageType.RANK_UPDATE, toRankUpdateResponse(room));
messageSender.sendBroadcast(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,9 @@ public void reconnectSendResponse(Long roomId, UserPrincipal principal) {
String destination = getDestination(roomId);
String userDestination = getUserDestination();

Long quizId = room.getQuizId();
Quiz quiz = quizService.findQuizById(quizId);

messageSender.sendBroadcast(
destination,
MessageType.SYSTEM_NOTICE,
Expand All @@ -330,14 +333,11 @@ public void reconnectSendResponse(Long roomId, UserPrincipal principal) {
messageSender.sendPersonal(
userDestination,
MessageType.GAME_START,
toGameStartResponse(room.getQuestions()),
toGameStartResponse(quiz.getQuizType(), room.getQuestions()),
principal.getName());
} else {
RoomSettingResponse roomSettingResponse = toRoomSettingResponse(room);

Long quizId = room.getGameSetting().getQuizId();

Quiz quiz = quizService.findQuizById(quizId);
Long questionsCount = quizService.getQuestionsCount(quizId);

GameSettingResponse gameSettingResponse =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package io.f1.backend.domain.game.dto.response;

import io.f1.backend.domain.quiz.dto.GameQuestionResponse;
import io.f1.backend.domain.quiz.entity.QuizType;

import java.util.List;

public record GameStartResponse(List<GameQuestionResponse> questions) {}
public record GameStartResponse(QuizType quizType, List<GameQuestionResponse> questions) {}
Original file line number Diff line number Diff line change
@@ -1,26 +1,11 @@
package io.f1.backend.domain.question.api;

import io.f1.backend.domain.question.app.QuestionService;

import lombok.RequiredArgsConstructor;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/questions")
@RequiredArgsConstructor
public class QuestionController {

private final QuestionService questionService;

@DeleteMapping("/{questionId}")
public ResponseEntity<Void> deleteQuestion(@PathVariable Long questionId) {
questionService.deleteQuestion(questionId);

return ResponseEntity.noContent().build();
}
}
public class QuestionController {}
Original file line number Diff line number Diff line change
@@ -1,72 +1,79 @@
package io.f1.backend.domain.question.app;

import static io.f1.backend.domain.question.mapper.QuestionMapper.questionRequestToQuestion;
import static io.f1.backend.domain.question.mapper.TextQuestionMapper.questionRequestToTextQuestion;
import static io.f1.backend.domain.quiz.app.QuizService.verifyUserAuthority;

import io.f1.backend.domain.question.dao.ContentQuestionRepository;
import io.f1.backend.domain.question.dao.QuestionRepository;
import io.f1.backend.domain.question.dao.TextQuestionRepository;
import io.f1.backend.domain.question.dto.QuestionRequest;
import io.f1.backend.domain.question.dto.QuestionUpdateRequest;
import io.f1.backend.domain.question.dto.ContentQuestionRequest;
import io.f1.backend.domain.question.dto.ContentQuestionUpdateRequest;
import io.f1.backend.domain.question.entity.ContentQuestion;
import io.f1.backend.domain.question.entity.Question;
import io.f1.backend.domain.question.entity.TextQuestion;
import io.f1.backend.domain.quiz.entity.Quiz;
import io.f1.backend.domain.quiz.entity.QuizType;
import io.f1.backend.global.exception.CustomException;
import io.f1.backend.global.exception.errorcode.QuestionErrorCode;
import io.f1.backend.global.util.FileManager;

import lombok.RequiredArgsConstructor;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class QuestionService {

private final QuestionRepository questionRepository;
private final TextQuestionRepository textQuestionRepository;

@Transactional
public void saveQuestion(Quiz quiz, QuestionRequest request) {
private final ContentQuestionRepository contentQuestionRepository;

Question question = questionRequestToQuestion(quiz, request);
public void saveContentQuestion(Quiz quiz, ContentQuestionRequest request) {
Question question = new Question(quiz, request.getAnswer());
quiz.addQuestion(question);
questionRepository.save(question);

TextQuestion textQuestion = questionRequestToTextQuestion(question, request.getContent());
textQuestionRepository.save(textQuestion);
question.addTextQuestion(textQuestion);
ContentQuestion contentQuestion = request.toContentQuestion(question);
contentQuestionRepository.save(contentQuestion);
question.addContentQuestion(contentQuestion);
}

public void updateQuestions(Quiz quiz, QuestionUpdateRequest request) {

public void updateContentQuestions(Quiz quiz, ContentQuestionUpdateRequest request) {
if (request.getId() == null) {
saveQuestion(quiz, QuestionRequest.of(request));
saveContentQuestion(
quiz, ContentQuestionRequest.of(request.getContent(), request.getAnswer()));

return;
}

Question question =
questionRepository
.findById(request.getId())
.orElseThrow(
() -> new CustomException(QuestionErrorCode.QUESTION_NOT_FOUND));
Question question = getQuestionWithContent(request.getId());

if (request.getContent() != null) {
ContentQuestion contentQuestion = question.getContentQuestion();
contentQuestion.changeContent(request.getContent());
}

TextQuestion textQuestion = question.getTextQuestion();
textQuestion.changeContent(request.getContent());
question.changeAnswer(request.getAnswer());
}

@Transactional
public void deleteQuestion(Long questionId) {
public void deleteQuestion(Long questionId, QuizType quizType) {
Question question;

Question question =
questionRepository
.findById(questionId)
.orElseThrow(
() -> new CustomException(QuestionErrorCode.QUESTION_NOT_FOUND));

verifyUserAuthority(question.getQuiz());
if (quizType.name().equals("IMAGE")) {
question = getQuestionWithContent(questionId);
String filePath = question.getContentQuestion().getContent();
FileManager.deleteFile(filePath);
} else {
question = getQuestion(questionId);
}

questionRepository.delete(question);
}

private Question getQuestion(Long questionId) {
return questionRepository
.findById(questionId)
.orElseThrow(() -> new CustomException(QuestionErrorCode.QUESTION_NOT_FOUND));
}

private Question getQuestionWithContent(Long questionId) {
return questionRepository
.findByIdWithContent(questionId)
.orElseThrow(() -> new CustomException(QuestionErrorCode.QUESTION_NOT_FOUND));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.f1.backend.domain.question.dao;

import io.f1.backend.domain.question.entity.ContentQuestion;

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

public interface ContentQuestionRepository extends JpaRepository<ContentQuestion, Long> {}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,12 @@
import io.f1.backend.domain.question.entity.Question;

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

public interface QuestionRepository extends JpaRepository<Question, Long> {}
import java.util.Optional;

public interface QuestionRepository extends JpaRepository<Question, Long> {

@Query("SELECT q FROM Question q JOIN FETCH q.contentQuestion WHERE q.id = :id")
Optional<Question> findByIdWithContent(Long id);
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.f1.backend.domain.question.dto;

import io.f1.backend.domain.question.entity.ContentQuestion;
import io.f1.backend.domain.question.entity.Question;
import io.f1.backend.domain.quiz.entity.Quiz;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ContentQuestionRequest {
private String content;
private String answer;

public static ContentQuestionRequest of(String content, String answer) {
return new ContentQuestionRequest(content, answer);
}

public ContentQuestion toContentQuestion(Question question) {
return new ContentQuestion(question, content);
}

public Question toQuestion(Quiz quiz) {
return new Question(quiz, answer);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.f1.backend.domain.question.dto;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ContentQuestionUpdateRequest {
private Long id;
private String content;
private String answer;

public static ContentQuestionUpdateRequest of(Long id, String content, String answer) {
return new ContentQuestionUpdateRequest(id, content, answer);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.f1.backend.domain.question.dto;

import io.f1.backend.global.validation.TrimmedSize;

import jakarta.validation.constraints.NotBlank;

public record ImageQuestionRequest(
@TrimmedSize(min = 1, max = 30) @NotBlank(message = "정답을 입력해주세요.") String answer) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.f1.backend.domain.question.dto;

import io.f1.backend.global.validation.TrimmedSize;

import jakarta.validation.constraints.NotBlank;

import lombok.Getter;

@Getter
public class ImageQuestionUpdateRequest {
private Long id;

private boolean imageFile;

@TrimmedSize(min = 1, max = 30)
@NotBlank(message = "정답을 입력해주세요.")
private String answer;

public boolean hasImageFile() {
return imageFile;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package io.f1.backend.domain.question.dto;

import java.util.List;

public record QuestionDeleteRequest(List<Long> questionIds) {}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
import jakarta.validation.constraints.NotBlank;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class QuestionUpdateRequest {

private Long id;
public class TextQuestionRequest {

@TrimmedSize(min = 5, max = 30)
@NotBlank(message = "문제를 입력해주세요.")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package io.f1.backend.domain.question.dto;

import io.f1.backend.global.validation.TrimmedSize;

import jakarta.validation.constraints.NotBlank;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class TextQuestionUpdateRequest {

private Long id;

@TrimmedSize(min = 5, max = 30)
@NotBlank(message = "문제를 입력해주세요.")
private String content;

@TrimmedSize(min = 1, max = 30)
@NotBlank(message = "정답을 입력해주세요.")
private String answer;
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class TextQuestion {
public class ContentQuestion {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand All @@ -28,7 +28,7 @@ public class TextQuestion {
@Column(nullable = false)
private String content;

public TextQuestion(Question question, String content) {
public ContentQuestion(Question question, String content) {
this.question = question;
this.content = content;
}
Expand Down
Loading