Completed
Push — master ( f7f222...74e4e6 )
by Rémi
02:50
created

SourcedUser::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
namespace MessageApp\User\Entity;
4
5
use Broadway\EventSourcing\EventSourcedAggregateRoot;
6
use MessageApp\Event\ThirdPartyAccountLinkedEvent;
7
use MessageApp\Event\ThirdPartyAccountReplacedEvent;
8
use MessageApp\Event\UserCreatedEvent;
9
use MessageApp\User\ApplicationUserId;
10
use MessageApp\User\ThirdParty\Account as ThirdPartyAccount;
11
use MessageApp\User\ThirdParty\Source;
12
13
class SourcedUser extends EventSourcedAggregateRoot
14
{
15
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
16
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
17
    /////////////////////////////////////////////   PROPERTIES   ///////////////////////////////////////////////////
18
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
19
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
20
21
    /**
22
     * @var ApplicationUserId
23
     */
24
    private $id;
25
26
    /**
27
     * @var string
28
     */
29
    private $name;
30
31
    /**
32
     * @var string
33
     */
34
    private $preferredLanguage;
35
36
    /**
37
     * @var ThirdPartyAccount[]
38
     */
39
    private $thirdPartyAccounts;
40
41
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
42
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
43
    /////////////////////////////////////////   PRIVATE CONSTRUCTOR   //////////////////////////////////////////////
44
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
45
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
46
47
    /**
48
     * Constructor
49
     */
50 6
    private function __construct()
51
    {
52 6
        $this->thirdPartyAccounts = [];
53 6
    }
54
55
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
56
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
57
    ////////////////////////////////////////////   DOMAIN METHODS   ////////////////////////////////////////////////
58
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
59
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
60
61
    /**
62
     * @param ThirdPartyAccount $thirdPartyUser
63
     */
64
    public function linkToThirdPartyAccount(ThirdPartyAccount $thirdPartyUser)
65
    {
66
        if ($this->isThirdPartyAccountAlreadyLinked($thirdPartyUser->getSource())) {
67
            $this->apply(new ThirdPartyAccountReplacedEvent($this->id, $thirdPartyUser));
68
        }
69
70
        $this->apply(new ThirdPartyAccountLinkedEvent($this->id, $thirdPartyUser));
71
    }
72
73
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
74
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
75
    //////////////////////////////////////////////   ACCESSORS   ///////////////////////////////////////////////////
76
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
77
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
78
79
    /**
80
     * Returns the user id
81
     *
82
     * @return ApplicationUserId
83
     */
84 3
    public function getId()
85
    {
86 3
        return $this->id;
87
    }
88
89
    /**
90
     * @return string
91
     */
92 3
    public function getAggregateRootId()
93
    {
94 3
        return $this->id;
95
    }
96
97
    /**
98
     * Returns the user name
99
     *
100
     * @return string
101
     */
102 3
    public function getName()
103
    {
104 3
        return $this->name;
105
    }
106
107
    /**
108
     * Returns the preferred language
109
     *
110
     * @return string
111
     */
112 3
    public function getPreferredLanguage()
113
    {
114 3
        return $this->preferredLanguage;
115
    }
116
117
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
118
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
119
    //////////////////////////////////////////   PRIVATE METHODS   /////////////////////////////////////////////////
120
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
121
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
122
123
    /**
124
     * Initialize the game
125
     *
126
     * @param ApplicationUserId $id
127
     * @param string            $name
128
     * @param string            $language
129
     */
130 3
    private function initialize(ApplicationUserId $id, $name, $language)
131
    {
132 3
        $this->apply(new UserCreatedEvent($id, $name, $language));
133 3
    }
134
135
    /**
136
     * @param Source $source
137
     *
138
     * @return bool
139
     */
140
    private function isThirdPartyAccountAlreadyLinked(Source $source)
141
    {
142
        return array_key_exists((string) $source, $this->thirdPartyAccounts);
143
    }
144
145
    /**
146
     * @param ThirdPartyAccount $account
147
     */
148
    private function setThirdPartyUser(ThirdPartyAccount $account)
149
    {
150
        $this->thirdPartyAccounts[(string) $account->getSource()] = $account;
151
    }
152
153
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
154
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
155
    ////////////////////////////////////////////   APPLY EVENTS   //////////////////////////////////////////////////
156
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
157
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
158
159
    /**
160
     * Apply the user created event
161
     *
162
     * @param \MessageApp\Event\UserCreatedEvent $event
163
     */
164 3
    protected function applyUserCreatedEvent(UserCreatedEvent $event)
165
    {
166 3
        $this->id = $event->getUserId();
167 3
        $this->name = $event->getUsername();
168 3
        $this->preferredLanguage = $event->getPreferredLanguage();
169 3
        $this->thirdPartyAccounts = [];
170 3
    }
171
172
    /**
173
     * Apply the third party account linked event
174
     *
175
     * @param ThirdPartyAccountLinkedEvent $event
176
     */
177
    protected function applyThirdPartyAccountLinkedEvent(ThirdPartyAccountLinkedEvent $event)
178
    {
179
        $this->setThirdPartyUser($event->getThirdPartyAccount());
180
    }
181
182
    /**
183
     * Apply the third party account replaced event
184
     *
185
     * @param ThirdPartyAccountReplacedEvent $event
186
     */
187
    protected function applyThirdPartyAccountReplacedEvent(ThirdPartyAccountReplacedEvent $event)
188
    {
189
        $this->setThirdPartyUser($event->getThirdPartyAccount());
190
    }
191
192
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
193
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
194
    /////////////////////////////////////////   STATIC CONSTRUCTOR   ///////////////////////////////////////////////
195
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
196
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
197
198
    /**
199
     * Create a new instance
200
     *
201
     * @param  ApplicationUserId $id
202
     * @param  string            $name
203
     * @param  string            $language
204
     *
205
     * @return SourcedUser
206
     */
207 3
    public static function createUser(ApplicationUserId $id, $name, $language)
208
    {
209 3
        $user = new self();
210 3
        $user->initialize(
211 2
            $id,
212 2
            $name,
213
            $language
214 2
        );
215
216 3
        return $user;
217
    }
218
219
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
220
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
221
    ///////////////////////////////////////////   RECONSTITUTION   /////////////////////////////////////////////////
222
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
223
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
224
225
    /**
226
     * Static construction method for reconstitution
227
     *
228
     * @return SourcedUser
229
     */
230 3
    public static function instantiateForReconstitution()
231
    {
232 3
        return new self();
233
    }
234
}
235