Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release3.3 #213

Merged
merged 2 commits into from
Jan 23, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
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);
}
Loading