Skip to content

Commit df62f23

Browse files
authored
Merge pull request #22 from AymaneTech/survey-participitation
Survey participitation
2 parents cca918a + 0492015 commit df62f23

File tree

5 files changed

+126
-11
lines changed

5 files changed

+126
-11
lines changed
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
package com.wora.state_of_dev.survey.application.service;
22

3-
public class SurveySubmissionService {
4-
}
3+
import com.wora.state_of_dev.survey.application.dto.request.ListOfQuestionSubmissionRequestDto;
4+
import com.wora.state_of_dev.survey.application.dto.request.SingleQuestionSubmissionRequestDto;
5+
import com.wora.state_of_dev.survey.domain.valueObject.SurveyEditionId;
6+
7+
public interface SurveySubmissionService {
8+
void submit(SurveyEditionId surveyEditionId, SingleQuestionSubmissionRequestDto dto);
9+
10+
void submit(SurveyEditionId surveyEditionId, ListOfQuestionSubmissionRequestDto dto);
11+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package com.wora.state_of_dev.survey.application.service.impl;
2+
3+
import com.wora.state_of_dev.common.domain.exception.EntityNotFoundException;
4+
import com.wora.state_of_dev.survey.application.dto.request.*;
5+
import com.wora.state_of_dev.survey.application.service.SurveySubmissionService;
6+
import com.wora.state_of_dev.survey.domain.entities.Answer;
7+
import com.wora.state_of_dev.survey.domain.entities.Question;
8+
import com.wora.state_of_dev.survey.domain.exception.GivenAnswerNotBelongToQuestion;
9+
import com.wora.state_of_dev.survey.domain.exception.QuestionNotBelongToSurveyEdition;
10+
import com.wora.state_of_dev.survey.domain.repository.AnswerRepository;
11+
import com.wora.state_of_dev.survey.domain.repository.QuestionRepository;
12+
import com.wora.state_of_dev.survey.domain.valueObject.AnswerId;
13+
import com.wora.state_of_dev.survey.domain.valueObject.AnswerType;
14+
import com.wora.state_of_dev.survey.domain.valueObject.QuestionId;
15+
import com.wora.state_of_dev.survey.domain.valueObject.SurveyEditionId;
16+
import jakarta.transaction.Transactional;
17+
import lombok.RequiredArgsConstructor;
18+
import org.springframework.stereotype.Service;
19+
20+
import java.util.List;
21+
import java.util.Objects;
22+
23+
@Service
24+
@Transactional
25+
@RequiredArgsConstructor
26+
public class DefaultSurveySubmissionService implements SurveySubmissionService {
27+
private final QuestionRepository questionRepository;
28+
private final AnswerRepository answerRepository;
29+
30+
private SurveyEditionId surveyEditionId;
31+
32+
@Override
33+
public void submit(SurveyEditionId surveyEditionId, SingleQuestionSubmissionRequestDto dto) {
34+
this.surveyEditionId = surveyEditionId;
35+
handleSubmission(dto);
36+
}
37+
38+
@Override
39+
public void submit(SurveyEditionId surveyEditionId, ListOfQuestionSubmissionRequestDto dto) {
40+
this.surveyEditionId = surveyEditionId;
41+
dto.submissions()
42+
.forEach(this::handleSubmission);
43+
}
44+
45+
private void handleSubmission(SingleQuestionSubmissionRequestDto dto) {
46+
Question question = findQuestionById(dto.questionId());
47+
if (!Objects.equals(surveyEditionId.value(), question.getChapter().getSurveyEdition().getId().value()))
48+
throw new QuestionNotBelongToSurveyEdition("the question with ID: " + question.getId().value() + " does not belong to survey of id " + surveyEditionId.value());
49+
50+
question.incrementAnswerCount();
51+
processAnswer(dto.answer(), question);
52+
}
53+
54+
private Question findQuestionById(Long questionId) {
55+
return questionRepository.findById(new QuestionId(questionId))
56+
.orElseThrow(() -> new EntityNotFoundException("question", questionId));
57+
}
58+
59+
private void processAnswer(AnswerSubmissionRequestDto<?> answerDto, Question question) {
60+
if (answerDto instanceof SingleChoiceSubmissionRequestDto singleChoiceAnswer
61+
&& question.getAnswerType().equals(AnswerType.SINGLE_CHOICE)) {
62+
processSingleChoiceAnswer(singleChoiceAnswer, question);
63+
} else if (answerDto instanceof MultiChoiceSubmissionRequestDto multiChoiceAnswer
64+
&& question.getAnswerType().equals(AnswerType.MULTI_CHOICE)) {
65+
processMultiChoiceAnswer(multiChoiceAnswer, question);
66+
} else {
67+
throw new IllegalArgumentException("Unsupported answer type");
68+
}
69+
}
70+
71+
private void processSingleChoiceAnswer(SingleChoiceSubmissionRequestDto answerDto, Question question) {
72+
Long answerId = answerDto.answer();
73+
Answer answer = answerRepository.findById(new AnswerId(answerId))
74+
.orElseThrow(() -> new EntityNotFoundException("answer", answerId));
75+
incrementSelectionCount(question, answer);
76+
}
77+
78+
private void processMultiChoiceAnswer(MultiChoiceSubmissionRequestDto answerDto, Question question) {
79+
List<AnswerId> answerIds = answerDto.answer().stream()
80+
.map(AnswerId::new)
81+
.toList();
82+
answerRepository.findAllById(answerIds)
83+
.forEach(answer -> incrementSelectionCount(question, answer));
84+
}
85+
86+
private void incrementSelectionCount(Question question, Answer answer) {
87+
if (answer.getQuestion().getId() != question.getId())
88+
throw new GivenAnswerNotBelongToQuestion("answer with id " + answer.getId().value() + " does not related to question " + question.getId().value());
89+
answer.incrementSelectCount();
90+
}
91+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.wora.state_of_dev.survey.domain.exception;
2+
3+
public class GivenAnswerNotBelongToQuestion extends RuntimeException {
4+
public GivenAnswerNotBelongToQuestion(String message) {
5+
super(message);
6+
}
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.wora.state_of_dev.survey.domain.exception;
2+
3+
public class QuestionNotBelongToSurveyEdition extends RuntimeException {
4+
public QuestionNotBelongToSurveyEdition(String s) {
5+
super(s);
6+
}
7+
}

src/main/java/com/wora/state_of_dev/survey/infrastructure/web/SurveySubmissionController.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,27 @@
33
import com.wora.state_of_dev.survey.application.dto.request.ListOfQuestionSubmissionRequestDto;
44
import com.wora.state_of_dev.survey.application.dto.request.SingleQuestionSubmissionRequestDto;
55
import com.wora.state_of_dev.survey.application.dto.request.SurveySubmission;
6+
import com.wora.state_of_dev.survey.application.service.SurveySubmissionService;
7+
import com.wora.state_of_dev.survey.domain.valueObject.SurveyEditionId;
68
import jakarta.validation.Valid;
9+
import lombok.RequiredArgsConstructor;
710
import org.springframework.http.ResponseEntity;
811
import org.springframework.web.bind.annotation.*;
912

1013
@RestController
1114
@RequestMapping("/api/v1/survey-editions/{id}/participate")
15+
@RequiredArgsConstructor
1216
public class SurveySubmissionController {
17+
private final SurveySubmissionService service;
1318

1419
@PostMapping
15-
public ResponseEntity<Object> participate(@PathVariable Long id, @RequestBody @Valid SurveySubmission dto) {
16-
if (dto instanceof SingleQuestionSubmissionRequestDto singleQuestion) {
17-
System.out.println("single one ");
18-
System.out.println(singleQuestion);
19-
} else if (dto instanceof ListOfQuestionSubmissionRequestDto listQuestion) {
20-
System.out.println("list of questions");
21-
System.out.println(listQuestion);
20+
public ResponseEntity<Void> participate(@PathVariable Long id, @RequestBody @Valid SurveySubmission dto) {
21+
SurveyEditionId surveyEditionId = new SurveyEditionId(id);
22+
if (dto instanceof SingleQuestionSubmissionRequestDto singleSubmission) {
23+
service.submit(surveyEditionId, singleSubmission);
24+
} else if (dto instanceof ListOfQuestionSubmissionRequestDto listSubmissions) {
25+
service.submit(surveyEditionId, listSubmissions);
2226
}
23-
System.out.println("here here");
24-
return ResponseEntity.ok(dto);
27+
return ResponseEntity.noContent().build();
2528
}
2629
}

0 commit comments

Comments
 (0)