Passed
Push — dev ( f622ff...5d3292 )
by Konstantin
05:09
created

delete(Integer)   A

Complexity

Conditions 2

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 3 Features 0
Metric Value
c 3
b 3
f 0
dl 0
loc 11
rs 9.85
cc 2
1
package easytests.api.v1.controllers;
2
3
import easytests.api.v1.exceptions.ForbiddenException;
4
import easytests.api.v1.exceptions.NotFoundException;
5
import easytests.api.v1.mappers.QuestionsMapper;
6
import easytests.api.v1.models.Question;
7
import easytests.core.models.QuestionModelInterface;
8
import easytests.core.models.TopicModelInterface;
9
import easytests.core.options.AnswersOptions;
10
import easytests.core.options.QuestionsOptions;
11
import easytests.core.options.QuestionsOptionsInterface;
12
import easytests.core.options.builder.QuestionsOptionsBuilderInterface;
13
import easytests.core.options.builder.TopicsOptionsBuilderInterface;
14
import easytests.core.services.QuestionsServiceInterface;
15
import easytests.core.services.TopicsServiceInterface;
16
import java.util.List;
17
import java.util.stream.Collectors;
18
import org.springframework.beans.factory.annotation.Autowired;
19
import org.springframework.beans.factory.annotation.Qualifier;
20
import org.springframework.web.bind.annotation.*;
21
22
23
/**
24
 * @author RisaMagpie
25
 */
26
@RestController("QuestionsControllerV1")
27
@SuppressWarnings("checkstyle:MultipleStringLiterals")
28
@RequestMapping("/v1/questions")
29
public class QuestionsController extends AbstractController {
30
    @Autowired
31
    protected QuestionsServiceInterface questionsService;
32
33
    @Autowired
34
    protected TopicsServiceInterface topicsService;
35
36
    @Autowired
37
    protected QuestionsOptionsBuilderInterface questionsOptionsBuilder;
38
39
    @Autowired
40
    protected TopicsOptionsBuilderInterface topicsOptionsBuilder;
41
42
    @Autowired
43
    @Qualifier("QuestionsMapperV1")
44
    private QuestionsMapper questionsMapper;
45
46
    @GetMapping
47
    public List<Question> list(@RequestParam(name = "topicId", required = true) Integer topicId)
48
            throws NotFoundException, ForbiddenException {
49
        final TopicModelInterface topicModel = this.topicsService.find(topicId, this.topicsOptionsBuilder.forAuth());
50
51
        if (topicModel == null) {
52
            throw new NotFoundException();
53
        }
54
55
        if (!this.acl.hasAccess(topicModel)) {
56
            throw new ForbiddenException();
57
        }
58
59
        final List<QuestionModelInterface> questionsModels =
60
                this.questionsService.findByTopic(topicModel, new QuestionsOptions().withAnswers(new AnswersOptions()));
61
62
        return questionsModels
63
                .stream()
64
                .map(model -> this.questionsMapper.map(model, Question.class))
65
                .collect(Collectors.toList());
66
    }
67
68
    /**
69
     * create
70
     */
71
    /**
72
     * update
73
     */
74
75
    @GetMapping("/{questionId}")
76
    public Question show(@PathVariable Integer questionId) throws NotFoundException, ForbiddenException {
77
        final QuestionModelInterface questionModel = this.getQuestionModel(
78
                questionId,
79
                this.questionsOptionsBuilder.forAuth().withAnswers(new AnswersOptions())
80
        );
81
        if (!this.acl.hasAccess(questionModel)) {
82
            throw new ForbiddenException();
83
        }
84
        return this.questionsMapper.map(questionModel, Question.class);
85
    }
86
87
    private QuestionModelInterface getQuestionModel(Integer id, QuestionsOptionsInterface
88
            questionOptions) throws NotFoundException {
89
        final QuestionModelInterface questionModel = this.questionsService.find(id, questionOptions);
90
        if (questionModel == null) {
91
            throw new NotFoundException();
92
        }
93
        return questionModel;
94
    }
95
96
    private QuestionModelInterface getQuestionModel(Integer id) throws NotFoundException {
97
        return this.getQuestionModel(id, this.questionsOptionsBuilder.forAuth());
98
    }
99
100
    @DeleteMapping("/{questionId}")
101
    public void delete(@PathVariable Integer questionId) throws NotFoundException, ForbiddenException {
102
        final QuestionModelInterface questionModel = this.getQuestionModel(questionId);
103
        final QuestionsOptionsInterface questionOption = this.questionsOptionsBuilder.forDelete();
104
105
        if (!this.acl.hasAccess(questionModel)) {
106
            throw new ForbiddenException();
107
        }
108
109
        final QuestionModelInterface questionModelForDelete = this.questionsService.find(questionId, questionOption);
110
        this.questionsService.delete(questionModelForDelete, questionOption);
111
    }
112
113
}
114