Skip to content

Commit

Permalink
feat: 서버에서 제공하는 질문지 만들기 api 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
joyfulviper committed Jan 23, 2024
1 parent 70a382f commit b01863b
Show file tree
Hide file tree
Showing 8 changed files with 111 additions and 6 deletions.
13 changes: 12 additions & 1 deletion api/src/docs/asciidoc/api/question/questions.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,15 @@ include::{snippets}/find-question-game/response-fields.adoc[]
include::{snippets}/delete-custom-questions-and-questionForm/http-request.adoc[]

==== Response
include::{snippets}/delete-custom-questions-and-questionForm/http-response.adoc[]
include::{snippets}/delete-custom-questions-and-questionForm/http-response.adoc[]

[[create-question-form-and-question-by-user]]
=== 서버에서 제공하는 질문 생성 API
서버에서 제공하는 질문을 생성하는 api 입니다. 오늘의 질문 받기가 오류가 발생한다면 해당 오류 메시지에 작성되어 있는 일차에 해당하는 질문을 생성해주세요

==== Request
include::{snippets}/create-question-form-and-question-by-user/http-request.adoc[]

==== Response (Success)
include::{snippets}/create-question-form-and-question-by-user/http-response.adoc[]
include::{snippets}/create-question-form-and-question-by-user/response-fields.adoc[]
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.lovely4k.backend.question.controller.request.AnswerQuestionRequest;
import com.lovely4k.backend.question.controller.request.AnsweredQuestionParamRequest;
import com.lovely4k.backend.question.controller.request.CreateQuestionFormRequest;
import com.lovely4k.backend.question.controller.request.CreateServerQuestionFormRequest;
import com.lovely4k.backend.question.repository.response.AnsweredQuestionResponse;
import com.lovely4k.backend.question.repository.response.DailyQuestionResponse;
import com.lovely4k.backend.question.repository.response.QuestionDetailsResponse;
Expand All @@ -21,6 +22,7 @@
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriComponentsBuilder;

import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
Expand Down Expand Up @@ -113,4 +115,10 @@ public ResponseEntity<Void> init() {
questionService.deleteQuestion();
return ResponseEntity.noContent().build();
}

//관리자용 엔드포인트
@PostMapping("/server")
public ResponseEntity<ApiResponse<Void>> addServerQuest(@RequestBody @Valid CreateServerQuestionFormRequest request) {
return ApiResponse.created(questionService.createServerQuestion(request.toServiceRequest()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.lovely4k.backend.question.controller.request;

import com.lovely4k.backend.question.service.request.CreateServerQuestionFormServiceRequest;
import jakarta.validation.constraints.NotBlank;

public record CreateServerQuestionFormRequest(
@NotBlank(message = "질문 내용은 비어 있을 수 없습니다.")
String questionContent,

@NotBlank(message = "첫 번째 선택지는 비어 있을 수 없습니다.")
String firstChoice,

@NotBlank(message = "두 번째 선택지는 비어 있을 수 없습니다.")
String secondChoice,

String thirdChoice,
String fourthChoice,
Long questionDay
) {
public CreateServerQuestionFormServiceRequest toServiceRequest() {
return new CreateServerQuestionFormServiceRequest(questionContent, firstChoice, secondChoice, thirdChoice, fourthChoice, questionDay);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.lovely4k.backend.question.repository.QuestionFormRepository;
import com.lovely4k.backend.question.repository.QuestionRepository;
import com.lovely4k.backend.question.service.request.CreateQuestionFormServiceRequest;
import com.lovely4k.backend.question.service.request.CreateServerQuestionFormServiceRequest;
import com.lovely4k.backend.question.service.response.CreateQuestionFormResponse;
import com.lovely4k.backend.question.service.response.CreateQuestionResponse;
import jakarta.persistence.EntityNotFoundException;
Expand Down Expand Up @@ -82,4 +83,9 @@ public void deleteQuestion() {
questionFormRepository.deleteAllByQuestionFormType(QuestionFormType.CUSTOM);
}

@Transactional
public Long createServerQuestion(CreateServerQuestionFormServiceRequest request) {
return questionFormRepository.save(request.toEntity()).getId();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,16 @@ public class QuestionValidator {
@Transactional(readOnly = true)
public void validateCreateQuestionForm(Long coupleId, long questionDay) {
List<Question> questions = findQuestionWithLock(coupleId, questionDay);
validateDailyQuestionLimitAndAnswerCompletion(questions);
validateDailyQuestionLimitAndAnswerCompletion(questions, questionDay);
}

private void validateDailyQuestionLimitAndAnswerCompletion(List<Question> questions) {
private void validateDailyQuestionLimitAndAnswerCompletion(List<Question> questions, Long questionDay) {
if (questions.size() > 1) {
throw new QuestionCreateCountExceedException();
}

if (questions.isEmpty()) {
throw new IllegalStateException("서버에서 제공하는 질문을 먼저 생성해 주세요.");
throw new IllegalStateException("다음 일차에 해당하는 서버에서 제공하는 질문을 먼저 생성해 주세요" + questionDay);
}

questions.get(0).validateAnswer();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.lovely4k.backend.question.service.request;

import com.lovely4k.backend.question.QuestionChoices;
import com.lovely4k.backend.question.QuestionForm;
import com.lovely4k.backend.question.QuestionFormType;

public record CreateServerQuestionFormServiceRequest(
String questionContent,
String firstChoice,
String secondChoice,
String thirdChoice,
String fourthChoice,
Long questionDay
) {
public QuestionForm toEntity() {
QuestionChoices questionChoices = QuestionChoices.create(firstChoice, secondChoice, thirdChoice, fourthChoice);

return QuestionForm.create(null, questionContent, questionChoices, questionDay, QuestionFormType.SERVER);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.lovely4k.backend.question.controller.QuestionController;
import com.lovely4k.backend.question.controller.request.AnswerQuestionRequest;
import com.lovely4k.backend.question.controller.request.CreateQuestionFormRequest;
import com.lovely4k.backend.question.controller.request.CreateServerQuestionFormRequest;
import com.lovely4k.backend.question.repository.response.*;
import com.lovely4k.backend.question.service.QuestionQueryService;
import com.lovely4k.backend.question.service.QuestionService;
Expand Down Expand Up @@ -286,4 +287,42 @@ void init() throws Exception {
.andDo(document("delete-custom-questions-and-questionForm"));
}

@DisplayName("서버의 질문 양식을 생성하는 API")
@Test
void createServerQuestionForm() throws Exception {
CreateServerQuestionFormRequest request = new CreateServerQuestionFormRequest(
"테스트 질문",
"선택지 1",
"선택지 2",
"선택지 3",
"선택지 4",
1L
);

given(questionService.createServerQuestion(any()))
.willReturn(1L);

mockMvc.perform(post("/v1/questions/server")
.content(objectMapper.writeValueAsString(request))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isCreated())
.andDo(document("create-question-form-and-question-by-user",
responseHeaders(
headerWithName("Location").description("리소스 저장 경로")
),
requestFields(
fieldWithPath("questionContent").type(STRING).description("질문 내용"),
fieldWithPath("firstChoice").type(STRING).description("첫 번째 선택지"),
fieldWithPath("secondChoice").type(STRING).description("두 번째 선택지"),
fieldWithPath("thirdChoice").type(STRING).description("세 번째 선택지"),
fieldWithPath("fourthChoice").type(STRING).description("네 번째 선택지"),
fieldWithPath("questionDay").type(NUMBER).description("질문에 해당하는 날짜")
),
responseFields(
fieldWithPath("code").type(NUMBER).description("코드"),
fieldWithPath("body").type(NULL).description("응답 바디"),
fieldWithPath("links").type(ARRAY).description("연결된 url")
)
));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,4 @@ public interface QuestionRepository extends JpaRepository<Question, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT q FROM Question q WHERE q.coupleId = :coupleId AND q.questionDay = :questionDay")
List<Question> findQuestionByCoupleIdAndQuestionDayWithLock(Long coupleId, Long questionDay);

List<Question> findQuestionByCoupleIdAndQuestionDay(Long coupleId, Long questionDay);
}

0 comments on commit b01863b

Please sign in to comment.