Passed
Push — master ( 2b0762...9c76a8 )
by Bertrand
26:13 queued 17:43
created

UserRepositorySql::verifyEmail()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
<?php
2
3
4
namespace App\Src\UseCases\Infra\Sql;
5
6
use App\Src\UseCases\Domain\Ports\UserRepository;
7
use App\Src\UseCases\Domain\User;
8
use App\Src\UseCases\Domain\Users\Identity;
9
use App\Src\UseCases\Domain\Users\State;
10
use App\Src\UseCases\Domain\Users\Stats;
11
use App\Src\UseCases\Domain\Users\UserDto;
12
use Illuminate\Support\Facades\DB;
13
use Ramsey\Uuid\Uuid;
14
15
class UserRepositorySql implements UserRepository
16
{
17
    public function getByEmail(string $email): ?User
18
    {
19
        $record = \App\User::where('email', $email)->first();
20
        if(!isset($record)){
21
            return null;
22
        }
23
        $roles = $record->roles()->pluck('name')->toArray();
24
        return $this->buildUser($record, $roles);
25
    }
26
27
    public function getById(string $id): ?User
28
    {
29
        $record = \App\User::where('uuid', $id)->first();
30
        if(!isset($record)){
31
            return null;
32
        }
33
        $roles = $record->roles()->pluck('name')->toArray();
34
        return $this->buildUser($record, $roles);
35
    }
36
37
    public function add(User $u, string $password = null)
38
    {
39
        $userModel = new \App\User();
40
        $data = $u->toArray();
41
        $roles = $data['roles'];
42
        unset($data['url_picture']);
43
        unset($data['roles']);
44
        $userModel->fill($data);
45
        $userModel->password = $password;
46
        $userModel->save();
47
48
        $userModel->syncRoles($roles);
49
    }
50
51
    public function update(User $u)
52
    {
53
        $userModel = \App\User::where('uuid', $u->id())->first();
54
        $oldEmail = $userModel->email;
55
56
        $data = $u->toArray();
57
        $roles = $data['roles'];
58
        unset($data['url_picture']);
59
        unset($data['roles']);
60
        $userModel->fill($data);
61
62
        if($oldEmail !== $data['email']){
63
            $userModel->email_verified_at = null;
64
            $userModel->sendEmailVerificationNotification();
65
        }
66
        $userModel->save();
67
        $userModel->syncRoles($roles);
68
    }
69
70
    public function updateProviders(User $u)
71
    {
72
        $userModel = \App\User::where('uuid', $u->id())->first();
73
        $providers = $u->toArray()['providers'];
74
        $userModel->providers = $providers;
75
        $userModel->save();
76
    }
77
78
    public function search(string $organizationId, int $page, int $perPage = 10): array
79
    {
80
        $first = DB::table('users', 'u')
81
            ->selectRaw('u.last_login_at, u.path_picture, u.uuid, u.id as uid, u.firstname as ufirstname, u.lastname as ulastname, u.email as uemail, invitations.id as iid, invitations.firstname as ifirstname, invitations.lastname as ilastname, invitations.email as iemail')
82
            ->leftJoin('invitations', 'invitations.email', 'u.email')
83
            ->where('u.organization_id', $organizationId);
84
85
        $records = DB::table('users', 'u')
86
            ->selectRaw('u.last_login_at, u.path_picture, u.uuid, u.id as uid, u.firstname as ufirstname, u.lastname as ulastname, u.email as uemail, invitations.id as iid, invitations.firstname as ifirstname, invitations.lastname as ilastname, invitations.email as iemail')
87
            ->rightJoin('invitations', 'invitations.email', 'u.email')
88
            ->where('invitations.organization_id', $organizationId)
89
            ->union($first)
90
            ->get()
91
        ;
92
93
        $count = $records->count();
94
95
        $records = DB::table('users', 'u')
96
            ->selectRaw('u.last_login_at, u.path_picture, u.uuid, u.id as uid, u.firstname as ufirstname, u.lastname as ulastname, u.email as uemail, invitations.id as iid, invitations.firstname as ifirstname, invitations.lastname as ilastname, invitations.email as iemail')
97
            ->rightJoin('invitations', 'invitations.email', 'u.email')
98
            ->where('invitations.organization_id', $organizationId)
99
            ->union($first)
100
            ->offset(($page-1)*$perPage)
101
            ->limit($perPage)
102
            ->get();
103
        if(empty($records)){
104
            return [];
105
        }
106
107
        $users = [];
108
        foreach($records as $record){
109
            if($record->uuid === null){
110
                $identity = new Identity(Uuid::uuid4(), $record->iemail, $record->ifirstname, $record->ilastname, null);
111
                $state = new State($organizationId, null, false, []);
112
                $users[] = new UserDto($identity, $state);
113
                continue;
114
            }
115
            $roles = \App\User::find($record->uid)->roles()->pluck('name')->toArray();
116
            $identity = new Identity($record->uuid, $record->uemail, $record->ufirstname, $record->ulastname, $record->path_picture);
117
            $state = new State($organizationId, $record->last_login_at, true, $roles);
118
            $users[] = new UserDto($identity, $state);
119
        }
120
        return [
121
            'list' => $users,
122
            'total' => $count
123
        ];
124
    }
125
126
    public function delete(string $userId)
127
    {
128
        $userModel = \App\User::where('uuid', $userId)->first();
129
        $userModel->delete();
130
    }
131
132
    public function getAdminOfOrganization(string $organizationId): array
133
    {
134
        $records = \App\User::role(['admin'])->where('organization_id', $organizationId)->get();
135
        if(empty($records)){
136
            return [];
137
        }
138
        $users = [];
139
        foreach($records as $record){
140
            $roles = \App\User::find($record->id)->roles()->pluck('name')->toArray();
141
            $users[] = new User($record->uuid, $record->email, $record->firstname, $record->lastname, $record->organization_id, $record->path_picture, $roles);
142
        }
143
        return $users;
144
    }
145
146
    public function getByProvider(string $provider, string $providerId): ?User
147
    {
148
        $record = \App\User::where('providers->'.$provider, $providerId)->first();
149
        if(!isset($record)){
150
            return null;
151
        }
152
        $roles = $record->roles()->pluck('name')->toArray();
153
        return new User($record->uuid, $record->email, $record->firstname, $record->lastname, $record->organization_id, $record->path_picture, $roles, $record->providers);
154
    }
155
156
    public function getStats(string $userId): Stats
157
    {
158
        $record = \App\User::where('uuid', $userId)->first();
159
        if(isset($record) && $record->wiki_stats !== null){
160
            return new Stats($record->wiki_stats);
161
        }
162
        return new Stats([]);
163
    }
164
165
    public function addStats(string $userId, Stats $stats)
166
    {
167
        DB::table('users')
168
            ->where('uuid', $userId)
169
            ->update(['wiki_stats' => $stats->toArray()]);
170
    }
171
172
    /**
173
     * @param $record
174
     * @param $roles
175
     * @return User
176
     */
177
    private function buildUser($record, $roles): User
178
    {
179
        return new User(
180
            $record->uuid,
181
            $record->email,
182
            $record->firstname,
183
            $record->lastname,
184
            $record->organization_id,
185
            $record->path_picture,
186
            $roles,
187
            $record->providers ?? []
188
        );
189
    }
190
191
    public function verifyEmail(string $userId)
192
    {
193
        $user = \App\User::where('uuid', $userId)->first();
194
        if(!isset($user)){
195
           return;
196
        }
197
        $user->markEmailAsVerified();
198
    }
199
200
201
}
202