Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
91.23% covered (success)
91.23%
52 / 57
91.67% covered (success)
91.67%
11 / 12
CRAP
0.00% covered (danger)
0.00%
0 / 1
Users
91.23% covered (success)
91.23%
52 / 57
91.67% covered (success)
91.67%
11 / 12
14.13
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 byLogin
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 byAuthToken
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 byOneTimeToken
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
2
 bySession
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 byUid
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 byId
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 remember
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 forget
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 createOneTimeToken
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 removeOneTimeToken
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 getUserOrNull
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray;
6
7use Celemas\Quma\Database;
8
9class Users
10{
11    public function __construct(
12        protected Database $db,
13    ) {}
14
15    public function byLogin(string $login): ?User
16    {
17        return $this->getUserOrNull(
18            $this->db->users->get([
19                'login' => $login,
20            ])->first(),
21        );
22    }
23
24    public function byAuthToken(#[\SensitiveParameter] string $token): ?User
25    {
26        return $this->getUserOrNull(
27            $this->db->users->get([
28                'token' => hash('sha256', $token),
29            ])->first(),
30        );
31    }
32
33    public function byOneTimeToken(#[\SensitiveParameter] string $token): ?User
34    {
35        $hashedToken = hash('sha256', $token);
36
37        $user = $this->getUserOrNull(
38            $this->db->users->get([
39                'onetimetoken' => $hashedToken,
40            ])->first(),
41        );
42
43        if ($user) {
44            $this->db->users->removeOneTimeToken([
45                'token' => $hashedToken,
46            ])->run();
47        }
48
49        return $user;
50    }
51
52    public function bySession(string $hash): ?User
53    {
54        return $this->getUserOrNull(
55            $this->db->users->get([
56                'sessionhash' => $hash,
57            ])->first(),
58        );
59    }
60
61    public function byUid(string $uid): ?User
62    {
63        return $this->getUserOrNull(
64            $this->db->users->get([
65                'uid' => $uid,
66            ])->first(),
67        );
68    }
69
70    public function byId(int $id): ?User
71    {
72        return $this->getUserOrNull(
73            $this->db->users->get([
74                'usr' => $id,
75            ])->first(),
76        );
77    }
78
79    public function remember(string $hash, int $userId, string $expires): bool
80    {
81        return $this->db->users->remember([
82            'hash' => $hash,
83            'user' => $userId,
84            'expires' => $expires,
85        ])->run();
86    }
87
88    public function forget(string $hash): bool
89    {
90        return $this->db->users->forget([
91            'hash' => $hash,
92        ])->run();
93    }
94
95    public function createOneTimeToken(int $userId): string
96    {
97        $token = bin2hex(random_bytes(32));
98
99        $this->db->users->saveOneTimeToken([
100            'token' => hash('sha256', $token),
101            'usr' => $userId,
102        ])->run();
103
104        return $token;
105    }
106
107    public function removeOneTimeToken(#[\SensitiveParameter] string $token): void
108    {
109        $this->db->users->removeOneTimeToken([
110            'token' => hash('sha256', $token),
111        ])->run();
112    }
113
114    protected function getUserOrNull(?array $data): ?User
115    {
116        if ($data) {
117            return new User($data);
118        }
119
120        return null;
121    }
122}