Skip to content

Commit 90a328e

Browse files
committed
✨ 설문지 제출, 제출 결과 리스트 조회
1 parent d3c461c commit 90a328e

File tree

9 files changed

+145
-12
lines changed

9 files changed

+145
-12
lines changed
Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,50 @@
11
package com.sinabro.sinabro.controller;
22

3+
import org.springframework.web.bind.annotation.GetMapping;
4+
import org.springframework.web.bind.annotation.PathVariable;
35
import org.springframework.web.bind.annotation.PostMapping;
46
import org.springframework.web.bind.annotation.RequestBody;
57
import org.springframework.web.bind.annotation.RequestMapping;
68
import org.springframework.web.bind.annotation.RestController;
79

8-
import com.sinabro.sinabro.entity.Survey;
910
import com.sinabro.sinabro.entity.request.SurveyRequest;
11+
import com.sinabro.sinabro.entity.response.SubmitterResultResponse;
12+
import com.sinabro.sinabro.entity.response.SurveyResponse;
1013
import com.sinabro.sinabro.service.SurveyService;
1114

15+
import io.swagger.v3.oas.annotations.Operation;
16+
import io.swagger.v3.oas.annotations.tags.Tag;
1217
import jakarta.validation.Valid;
1318
import lombok.RequiredArgsConstructor;
1419

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

2026
private final SurveyService surveyService;
21-
@PostMapping("/")
22-
public Survey createSurvey(@Valid @RequestBody SurveyRequest request) {
27+
@Operation(summary = "설문지 생성", description = "첫 설문지를 생성합니다.")
28+
@PostMapping("")
29+
public SurveyResponse createSurvey(@Valid @RequestBody SurveyRequest request) {
2330
return surveyService.createSurvey(request);
2431
}
2532

26-
// @PostMapping("/{uuid}/answers")
27-
// public SurveyRequest getSurveyAnswers(@PathVariable String uuid) {
28-
// return surveyService.getSurveyAnswers(uuid);
29-
// }
33+
@Operation(summary = "특정 설문지 정답 요청", description = "특정 설문지의 정답을 받아옵니다.")
34+
@GetMapping("/{uuid}/answers")
35+
public SurveyRequest getSurveyAnswers(@PathVariable String uuid) {
36+
return surveyService.getSurveyAnswers(uuid);
37+
}
38+
39+
@Operation(summary = "설문지 제출자 결과 리스트 요청", description = "제출자들의 결과 정보를 가져옵니다.")
40+
@GetMapping("/{uuid}/results")
41+
public SubmitterResultResponse getSubmitterResults(@PathVariable String uuid) {
42+
return surveyService.getSubmitterResults(uuid);
43+
}
44+
45+
@Operation(summary = "설문지에 대한 응답 제출", description = "설문지에 대한 응답 제출")
46+
@PostMapping("/{uuid}/submission")
47+
public void createSubmission(@Valid @RequestBody SurveyRequest request, @PathVariable String uuid ) {
48+
surveyService.createSubmission(request, uuid);
49+
}
3050
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.sinabro.sinabro.dto;
2+
3+
import com.sinabro.sinabro.entity.Submitter;
4+
5+
public record SubmitterInfo(
6+
String name,
7+
Integer score
8+
) {
9+
public static SubmitterInfo of(Submitter submitter) {
10+
return new SubmitterInfo(
11+
submitter.getName(),
12+
submitter.getScore()
13+
);
14+
}
15+
}

src/main/java/com/sinabro/sinabro/entity/request/SurveyRequest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,15 @@ public record SurveyRequest(
66
String creatorName,
77
List<QuestionAnswerPair> answers
88
) {
9+
public static SurveyRequest of(String creatorName, List<QuestionAnswerPair> answers) {
10+
return new SurveyRequest(creatorName, answers);
11+
}
912
public record QuestionAnswerPair(
1013
Integer questionId,
1114
Integer answerId
12-
) {}
15+
) {
16+
public static QuestionAnswerPair of(Integer questionId, Integer answerId) {
17+
return new QuestionAnswerPair(questionId, answerId);
18+
}
19+
}
1320
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.sinabro.sinabro.entity.response;
2+
3+
import java.util.List;
4+
5+
import com.sinabro.sinabro.dto.SubmitterInfo;
6+
7+
public record SubmitterResultResponse(
8+
String creatorname,
9+
List<SubmitterInfo> submitterInfoList
10+
) {
11+
public static SubmitterResultResponse of (String creatorname, List<SubmitterInfo> submitterInfoList) {
12+
return new SubmitterResultResponse(
13+
creatorname,
14+
submitterInfoList
15+
);
16+
}
17+
}
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
package com.sinabro.sinabro.entity.response;
22

3-
public class SurveyResponse {
3+
import com.sinabro.sinabro.entity.Survey;
4+
5+
public record SurveyResponse(
6+
String url
7+
) {
8+
public static SurveyResponse from(Survey survey) {
9+
return new SurveyResponse(
10+
survey.getUrl()
11+
);
12+
}
413
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.sinabro.sinabro.repository;
22

3+
import java.util.List;
4+
35
import org.springframework.data.jpa.repository.JpaRepository;
46

57
import com.sinabro.sinabro.entity.Creator;
8+
import com.sinabro.sinabro.entity.Survey;
69

710
public interface CreatorRepository extends JpaRepository<Creator, Long> {
11+
List<Creator> findBySurvey(Survey survey);
812
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.sinabro.sinabro.repository;
22

3+
import java.util.List;
4+
35
import org.springframework.data.jpa.repository.JpaRepository;
46

57
import com.sinabro.sinabro.entity.Submitter;
8+
import com.sinabro.sinabro.entity.Survey;
69

710
public interface SubmitterRepository extends JpaRepository<Submitter, Long> {
11+
List<Submitter> findBySurveyOrderByScoreDesc(Survey survey);
812
}
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.sinabro.sinabro.repository;
22

3+
import java.util.Optional;
4+
35
import org.springframework.data.jpa.repository.JpaRepository;
46

5-
public interface SurveyRepository extends JpaRepository<com.sinabro.sinabro.entity.Survey, Long> {
7+
import com.sinabro.sinabro.entity.Survey;
68

9+
public interface SurveyRepository extends JpaRepository<Survey, Long> {
10+
Optional<Survey> findSurveyByUrl(String url);
711
}

src/main/java/com/sinabro/sinabro/service/SurveyService.java

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@
22

33
import java.time.LocalDateTime;
44
import java.util.List;
5+
import java.util.Map;
56
import java.util.UUID;
7+
import java.util.stream.Collectors;
68

79
import org.springframework.stereotype.Service;
810
import org.springframework.transaction.annotation.Transactional;
911

12+
import com.sinabro.sinabro.dto.SubmitterInfo;
1013
import com.sinabro.sinabro.entity.Creator;
14+
import com.sinabro.sinabro.entity.Submitter;
1115
import com.sinabro.sinabro.entity.Survey;
1216
import com.sinabro.sinabro.entity.request.SurveyRequest;
17+
import com.sinabro.sinabro.entity.response.SubmitterResultResponse;
18+
import com.sinabro.sinabro.entity.response.SurveyResponse;
1319
import com.sinabro.sinabro.repository.CreatorRepository;
1420
import com.sinabro.sinabro.repository.SubmitterRepository;
1521
import com.sinabro.sinabro.repository.SurveyRepository;
@@ -25,7 +31,7 @@ public class SurveyService {
2531
private final SubmitterRepository submitterRepository;
2632
private final CreatorRepository creatorRepository;
2733

28-
public Survey createSurvey(SurveyRequest surveyRequest) {
34+
public SurveyResponse createSurvey(SurveyRequest surveyRequest) {
2935
Survey survey = Survey.builder()
3036
.creatorName(surveyRequest.creatorName())
3137
.url(generateSurveyUrl())
@@ -42,11 +48,58 @@ public Survey createSurvey(SurveyRequest surveyRequest) {
4248
.build();
4349
creatorRepository.save(creator);
4450
}
45-
return survey;
51+
return SurveyResponse.from(survey);
4652
}
4753

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

58+
public SurveyRequest getSurveyAnswers(String uuid) {
59+
Survey survey = surveyRepository.findSurveyByUrl(uuid)
60+
.orElseThrow(() -> new IllegalArgumentException("등록되지 않은 설문지 입니다."));
61+
62+
List<SurveyRequest.QuestionAnswerPair> answers = creatorRepository.findBySurvey(survey).stream()
63+
.map(creator -> SurveyRequest.QuestionAnswerPair.of(creator.getQuestionNumber(), creator.getAnswerNumber()))
64+
.toList();
65+
66+
return SurveyRequest.of(survey.getCreatorName(), answers);
67+
}
68+
69+
public SubmitterResultResponse getSubmitterResults(String uuid) {
70+
Survey survey = surveyRepository.findSurveyByUrl(uuid)
71+
.orElseThrow(() -> new IllegalArgumentException("등록되지 않은 설문지 입니다."));
72+
73+
List<SubmitterInfo> submitterInfoList = submitterRepository.findBySurveyOrderByScoreDesc(survey).stream()
74+
.map(SubmitterInfo::of)
75+
.toList();
76+
77+
return SubmitterResultResponse.of(survey.getCreatorName(), submitterInfoList);
78+
}
79+
80+
public void createSubmission(SurveyRequest request, String uuid) {
81+
Survey survey = surveyRepository.findSurveyByUrl(uuid)
82+
.orElseThrow(() -> new IllegalArgumentException("등록되지 않은 설문지 입니다."));
83+
84+
List<Creator> creatorAnswers = creatorRepository.findBySurvey(survey);
85+
Map<Integer, Integer> correctAnswers = creatorAnswers.stream()
86+
.collect(Collectors.toMap(Creator::getQuestionNumber, Creator::getAnswerNumber));
87+
88+
// 100점 만점 기준
89+
int totalQuestions = correctAnswers.size();
90+
long correctCount = request.answers().stream()
91+
.filter(answer -> correctAnswers.get(answer.questionId()) != null &&
92+
correctAnswers.get(answer.questionId()).equals(answer.answerId()))
93+
.count();
94+
95+
int score = (int) ((double) correctCount / totalQuestions * 100);
96+
97+
Submitter submitter = Submitter.builder()
98+
.survey(survey)
99+
.name(request.creatorName())
100+
.score(score)
101+
.build();
102+
103+
submitterRepository.save(submitter);
104+
}
52105
}

0 commit comments

Comments
 (0)