Question::archiveOn()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 9
rs 9.6666
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace VSV\GVQ_API\Question\Models;
4
5
use Ramsey\Uuid\UuidInterface;
6
use VSV\GVQ_API\Common\ValueObjects\Language;
7
use VSV\GVQ_API\Common\ValueObjects\NotEmptyString;
8
use VSV\GVQ_API\Question\ValueObjects\Year;
9
10
class Question
11
{
12
    /**
13
     * @var UuidInterface
14
     */
15
    private $id;
16
17
    /**
18
     * @var Language
19
     */
20
    private $language;
21
22
    /**
23
     * @var Year
24
     */
25
    private $year;
26
27
    /**
28
     * @var Category
29
     */
30
    private $category;
31
32
    /**
33
     * @var NotEmptyString
34
     */
35
    private $text;
36
37
    /**
38
     * @var NotEmptyString
39
     */
40
    private $imageFileName;
41
42
    /**
43
     * @var Answers
44
     */
45
    private $answers;
46
47
    /**
48
     * @var NotEmptyString
49
     */
50
    private $feedback;
51
52
    /**
53
     * @var \DateTimeImmutable
54
     */
55
    private $archivedOn;
56
57
    /**
58
     * @param UuidInterface $id
59
     * @param Language $language
60
     * @param Year $year
61
     * @param Category $category
62
     * @param NotEmptyString $text
63
     * @param NotEmptyString $imageFileName
64
     * @param Answers $answers
65
     * @param NotEmptyString $feedback
66
     */
67
    public function __construct(
68
        UuidInterface $id,
69
        Language $language,
70
        Year $year,
71
        Category $category,
72
        NotEmptyString $text,
73
        NotEmptyString $imageFileName,
74
        Answers $answers,
75
        NotEmptyString $feedback
76
    ) {
77
        if (count($answers) < 2 || count($answers) > 3) {
78
            throw new \InvalidArgumentException('Amount of answers must be 2 or 3.');
79
        }
80
81
        $this->id = $id;
82
        $this->language = $language;
83
        $this->year = $year;
84
        $this->category = $category;
85
        $this->text = $text;
86
        $this->imageFileName = $imageFileName;
87
        $this->answers = $answers;
88
        $this->feedback = $feedback;
89
    }
90
91
    /**
92
     * @return UuidInterface
93
     */
94
    public function getId(): UuidInterface
95
    {
96
        return $this->id;
97
    }
98
99
    /**
100
     * @return Language
101
     */
102
    public function getLanguage(): Language
103
    {
104
        return $this->language;
105
    }
106
107
    /**
108
     * @return Year
109
     */
110
    public function getYear(): Year
111
    {
112
        return $this->year;
113
    }
114
115
    /**
116
     * @return Category
117
     */
118
    public function getCategory(): Category
119
    {
120
        return $this->category;
121
    }
122
123
    /**
124
     * @return NotEmptyString
125
     */
126
    public function getText(): NotEmptyString
127
    {
128
        return $this->text;
129
    }
130
131
    /**
132
     * @return NotEmptyString
133
     */
134
    public function getImageFileName(): NotEmptyString
135
    {
136
        return $this->imageFileName;
137
    }
138
139
    /**
140
     * @return Answers
141
     */
142
    public function getAnswers(): Answers
143
    {
144
        return $this->answers;
145
    }
146
147
    /**
148
     * @return NotEmptyString
149
     */
150
    public function getFeedback(): NotEmptyString
151
    {
152
        return $this->feedback;
153
    }
154
155
    /**
156
     * @param \DateTimeImmutable $archiveOn
157
     */
158
    public function archiveOn(\DateTimeImmutable $archiveOn): void
159
    {
160
        if ($this->archivedOn !== null) {
161
            throw new \DomainException(
162
                'The question with id: "'.$this->getId()->toString().'" was already archived.'
163
            );
164
        }
165
166
        $this->archivedOn = $archiveOn;
167
    }
168
169
    /**
170
     * @return bool
171
     */
172
    public function isArchived(): bool
173
    {
174
        return $this->archivedOn !== null;
175
    }
176
177
    /**
178
     * @return \DateTimeImmutable
179
     */
180
    public function getArchivedOn(): ?\DateTimeImmutable
181
    {
182
        return $this->archivedOn;
183
    }
184
}
185