Completed
Branch v2.0.0 (c22f10)
by Alexander
03:04
created

User   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 118
Duplicated Lines 0 %

Coupling/Cohesion

Components 4
Dependencies 4

Importance

Changes 0
Metric Value
wmc 16
lcom 4
cbo 4
dl 0
loc 118
rs 10
c 0
b 0
f 0

15 Methods

Rating   Name   Duplication   Size   Complexity  
A revealPassword() 0 4 1
A getRole() 0 4 1
A setRole() 0 6 1
A generatePasswordHash() 0 4 1
A initialize() 0 7 1
A beforeUpdate() 0 4 1
A buildPasswordHash() 0 7 1
A doesPasswordMatch() 0 4 1
A setId() 0 12 2
A getId() 0 4 1
A setName() 0 6 1
A getName() 0 4 1
A setEmail() 0 6 1
A getEmail() 0 4 1
A setPassword() 0 6 1
1
<?php
2
/**
3
 * @author Alexander Torosh <[email protected]>
4
 */
5
6
namespace Domain\User;
7
8
use Core\Domain\DomainModel;
9
use Domain\User\Exceptions\UserException;
10
use Domain\User\Specifications\UserPasswordSpecification;
11
use Domain\User\Specifications\UserSpecification;
12
13
class User extends DomainModel
14
{
15
    const ROLES = [
16
        'member',
17
        'editor',
18
        'admin',
19
    ];
20
21
    private $id = 0;
22
    private $email = '';
23
    private $name = '';
24
    private $role = self::ROLES[0];
25
    private $password = '';
26
    private $password_hash = '';
27
28
    private $created_at;
29
    private $updated_at;
30
31
    public function initialize()
32
    {
33
        $this->setSource('users');
34
35
        $this->skipAttributesOnCreate(['id', 'password', 'created_at', 'updated_at']);
36
        $this->skipAttributesOnUpdate(['password']);
37
    }
38
39
    public function beforeUpdate()
40
    {
41
        $this->updated_at = date('Y-m-d H:i:s');
42
    }
43
44
    public function buildPasswordHash()
45
    {
46
        $passwordSpecification = new UserPasswordSpecification($this->password);
47
        $passwordSpecification->validate();
48
49
        $this->password_hash = $this->generatePasswordHash();
50
    }
51
52
    /**
53
     * @throws DomainException
54
     */
55
    public function doesPasswordMatch(string $inputPassword): bool
56
    {
57
        return password_verify($inputPassword, $this->password_hash);
58
    }
59
60
    public function setId(int $id): User
61
    {
62
        if ($this->id > 0) {
63
            throw new UserException('Identifier `id` is already defined.');
64
        }
65
        $this->id = $id;
66
67
        $specification = new UserSpecification($this);
68
        $specification->validateIdentifier();
69
70
        return $this;
71
    }
72
73
    public function getId(): int
74
    {
75
        return (int) $this->id;
76
    }
77
78
    public function setName(string $name): User
79
    {
80
        $this->name = $name;
81
82
        return $this;
83
    }
84
85
    public function getName(): string
86
    {
87
        return $this->name;
88
    }
89
90
    public function setEmail(string $email): User
91
    {
92
        $this->email = $email;
93
94
        return $this;
95
    }
96
97
    public function getEmail(): string
98
    {
99
        return $this->email;
100
    }
101
102
    public function setPassword(string $password): User
103
    {
104
        $this->password = $password;
105
106
        return $this;
107
    }
108
109
    public function revealPassword(): string
110
    {
111
        return $this->password;
112
    }
113
114
    public function getRole(): string
115
    {
116
        return $this->role;
117
    }
118
119
    public function setRole($role): User
120
    {
121
        $this->role = $role;
122
123
        return $this;
124
    }
125
126
    private function generatePasswordHash(): string
127
    {
128
        return password_hash($this->password, PASSWORD_ARGON2I);
129
    }
130
}
131