Skip to content

Commit

Permalink
✨ 설문지 제출, 제출 결과 리스트 조회
Browse files Browse the repository at this point in the history
  • Loading branch information
rong5026 committed Oct 27, 2024
1 parent d3c461c commit 90a328e
Show file tree
Hide file tree
Showing 9 changed files with 145 additions and 12 deletions.
34 changes: 27 additions & 7 deletions src/main/java/com/sinabro/sinabro/controller/SurveyController.java
Original file line number Diff line number Diff line change
@@ -1,30 +1,50 @@
package com.sinabro.sinabro.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.sinabro.sinabro.entity.Survey;
import com.sinabro.sinabro.entity.request.SurveyRequest;
import com.sinabro.sinabro.entity.response.SubmitterResultResponse;
import com.sinabro.sinabro.entity.response.SurveyResponse;
import com.sinabro.sinabro.service.SurveyService;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@Tag(name = "1. [설문조사]", description = "설문조사 API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/sinabro/api/v1/surveys")
public class SurveyController {

private final SurveyService surveyService;
@PostMapping("/")
public Survey createSurvey(@Valid @RequestBody SurveyRequest request) {
@Operation(summary = "설문지 생성", description = "첫 설문지를 생성합니다.")
@PostMapping("")
public SurveyResponse createSurvey(@Valid @RequestBody SurveyRequest request) {
return surveyService.createSurvey(request);
}

// @PostMapping("/{uuid}/answers")
// public SurveyRequest getSurveyAnswers(@PathVariable String uuid) {
// return surveyService.getSurveyAnswers(uuid);
// }
@Operation(summary = "특정 설문지 정답 요청", description = "특정 설문지의 정답을 받아옵니다.")
@GetMapping("/{uuid}/answers")
public SurveyRequest getSurveyAnswers(@PathVariable String uuid) {
return surveyService.getSurveyAnswers(uuid);
}

@Operation(summary = "설문지 제출자 결과 리스트 요청", description = "제출자들의 결과 정보를 가져옵니다.")
@GetMapping("/{uuid}/results")
public SubmitterResultResponse getSubmitterResults(@PathVariable String uuid) {
return surveyService.getSubmitterResults(uuid);
}

@Operation(summary = "설문지에 대한 응답 제출", description = "설문지에 대한 응답 제출")
@PostMapping("/{uuid}/submission")
public void createSubmission(@Valid @RequestBody SurveyRequest request, @PathVariable String uuid ) {
surveyService.createSubmission(request, uuid);
}
}
15 changes: 15 additions & 0 deletions src/main/java/com/sinabro/sinabro/dto/SubmitterInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.sinabro.sinabro.dto;

import com.sinabro.sinabro.entity.Submitter;

public record SubmitterInfo(
String name,
Integer score
) {
public static SubmitterInfo of(Submitter submitter) {
return new SubmitterInfo(
submitter.getName(),
submitter.getScore()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,15 @@ public record SurveyRequest(
String creatorName,
List<QuestionAnswerPair> answers
) {
public static SurveyRequest of(String creatorName, List<QuestionAnswerPair> answers) {
return new SurveyRequest(creatorName, answers);
}
public record QuestionAnswerPair(
Integer questionId,
Integer answerId
) {}
) {
public static QuestionAnswerPair of(Integer questionId, Integer answerId) {
return new QuestionAnswerPair(questionId, answerId);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.sinabro.sinabro.entity.response;

import java.util.List;

import com.sinabro.sinabro.dto.SubmitterInfo;

public record SubmitterResultResponse(
String creatorname,
List<SubmitterInfo> submitterInfoList
) {
public static SubmitterResultResponse of (String creatorname, List<SubmitterInfo> submitterInfoList) {
return new SubmitterResultResponse(
creatorname,
submitterInfoList
);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
package com.sinabro.sinabro.entity.response;

public class SurveyResponse {
import com.sinabro.sinabro.entity.Survey;

public record SurveyResponse(
String url
) {
public static SurveyResponse from(Survey survey) {
return new SurveyResponse(
survey.getUrl()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.sinabro.sinabro.repository;

import java.util.List;

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

import com.sinabro.sinabro.entity.Creator;
import com.sinabro.sinabro.entity.Survey;

public interface CreatorRepository extends JpaRepository<Creator, Long> {
List<Creator> findBySurvey(Survey survey);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.sinabro.sinabro.repository;

import java.util.List;

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

import com.sinabro.sinabro.entity.Submitter;
import com.sinabro.sinabro.entity.Survey;

public interface SubmitterRepository extends JpaRepository<Submitter, Long> {
List<Submitter> findBySurveyOrderByScoreDesc(Survey survey);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.sinabro.sinabro.repository;

import java.util.Optional;

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

public interface SurveyRepository extends JpaRepository<com.sinabro.sinabro.entity.Survey, Long> {
import com.sinabro.sinabro.entity.Survey;

public interface SurveyRepository extends JpaRepository<Survey, Long> {
Optional<Survey> findSurveyByUrl(String url);
}
57 changes: 55 additions & 2 deletions src/main/java/com/sinabro/sinabro/service/SurveyService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,20 @@

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

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

import com.sinabro.sinabro.dto.SubmitterInfo;
import com.sinabro.sinabro.entity.Creator;
import com.sinabro.sinabro.entity.Submitter;
import com.sinabro.sinabro.entity.Survey;
import com.sinabro.sinabro.entity.request.SurveyRequest;
import com.sinabro.sinabro.entity.response.SubmitterResultResponse;
import com.sinabro.sinabro.entity.response.SurveyResponse;
import com.sinabro.sinabro.repository.CreatorRepository;
import com.sinabro.sinabro.repository.SubmitterRepository;
import com.sinabro.sinabro.repository.SurveyRepository;
Expand All @@ -25,7 +31,7 @@ public class SurveyService {
private final SubmitterRepository submitterRepository;
private final CreatorRepository creatorRepository;

public Survey createSurvey(SurveyRequest surveyRequest) {
public SurveyResponse createSurvey(SurveyRequest surveyRequest) {
Survey survey = Survey.builder()
.creatorName(surveyRequest.creatorName())
.url(generateSurveyUrl())
Expand All @@ -42,11 +48,58 @@ public Survey createSurvey(SurveyRequest surveyRequest) {
.build();
creatorRepository.save(creator);
}
return survey;
return SurveyResponse.from(survey);
}

private String generateSurveyUrl() {
return UUID.randomUUID().toString().replace("-", "").substring(0, 5); // 5자리 문자열
}

public SurveyRequest getSurveyAnswers(String uuid) {
Survey survey = surveyRepository.findSurveyByUrl(uuid)
.orElseThrow(() -> new IllegalArgumentException("등록되지 않은 설문지 입니다."));

List<SurveyRequest.QuestionAnswerPair> answers = creatorRepository.findBySurvey(survey).stream()
.map(creator -> SurveyRequest.QuestionAnswerPair.of(creator.getQuestionNumber(), creator.getAnswerNumber()))
.toList();

return SurveyRequest.of(survey.getCreatorName(), answers);
}

public SubmitterResultResponse getSubmitterResults(String uuid) {
Survey survey = surveyRepository.findSurveyByUrl(uuid)
.orElseThrow(() -> new IllegalArgumentException("등록되지 않은 설문지 입니다."));

List<SubmitterInfo> submitterInfoList = submitterRepository.findBySurveyOrderByScoreDesc(survey).stream()
.map(SubmitterInfo::of)
.toList();

return SubmitterResultResponse.of(survey.getCreatorName(), submitterInfoList);
}

public void createSubmission(SurveyRequest request, String uuid) {
Survey survey = surveyRepository.findSurveyByUrl(uuid)
.orElseThrow(() -> new IllegalArgumentException("등록되지 않은 설문지 입니다."));

List<Creator> creatorAnswers = creatorRepository.findBySurvey(survey);
Map<Integer, Integer> correctAnswers = creatorAnswers.stream()
.collect(Collectors.toMap(Creator::getQuestionNumber, Creator::getAnswerNumber));

// 100점 만점 기준
int totalQuestions = correctAnswers.size();
long correctCount = request.answers().stream()
.filter(answer -> correctAnswers.get(answer.questionId()) != null &&
correctAnswers.get(answer.questionId()).equals(answer.answerId()))
.count();

int score = (int) ((double) correctCount / totalQuestions * 100);

Submitter submitter = Submitter.builder()
.survey(survey)
.name(request.creatorName())
.score(score)
.build();

submitterRepository.save(submitter);
}
}

0 comments on commit 90a328e

Please sign in to comment.