Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
65.22% covered (warning)
65.22%
15 / 23
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
UserQueryBuilder
65.22% covered (warning)
65.22%
15 / 23
50.00% covered (danger)
50.00%
1 / 2
10.69
0.00% covered (danger)
0.00%
0 / 1
 search
52.94% covered (warning)
52.94%
9 / 17
0.00% covered (danger)
0.00%
0 / 1
12.11
 byPermission
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace Domain\User\QueryBuilders;
4
5use Domain\User\DTOs\SearchUserDTO;
6use Domain\User\Enums\AccessLevel;
7use Illuminate\Database\Eloquent\Builder;
8
9class UserQueryBuilder extends Builder
10{
11
12    /**
13     * @param SearchUserDTO $userDTO
14     * @return $this
15     */
16    public function search(SearchUserDTO $userDTO): static
17    {
18        if ($userDTO->badge) {
19            $this->where('badge', $userDTO->badge);
20        }
21
22        if ($userDTO->name) {
23            $this->where('name', 'ilike', '%' . $userDTO->name . '%');
24        }
25
26        if ($userDTO->email) {
27            $this->where('email', 'ilike', '%' . $userDTO->email . '%');
28        }
29
30        if ($userDTO->id) {
31            $this->where('id', $userDTO->id);
32        }
33
34        if (count($userDTO->accessLevels) > 0) {
35            $placeholders = implode(',', array_fill(0, count($userDTO->accessLevels), '?'));
36            $this->whereRaw("
37                EXISTS (
38                    SELECT 1
39                    FROM jsonb_each(users.access_level) AS kv(key, value)
40                    WHERE EXISTS (
41                        SELECT 1
42                        FROM jsonb_array_elements_text(kv.value) AS elem
43                        WHERE elem::int IN ($placeholders)
44                    )
45                )
46            ", $userDTO->accessLevels);
47        }
48
49        if (count($userDTO->sector) > 0) {
50            // passado o array do PHP formatado como um array literal do PostgreSQL
51            $sectors = '{' . implode(',', $userDTO->sector) . '}';
52
53            // utilizado ??| para que o Laravel entenda que é o operador do Postgres, não um placeholder
54            $this->whereRaw("access_level ??| ?", [$sectors]);
55        }
56
57        return $this;
58    }
59
60    /**
61     * @param AccessLevel $accessLevel
62     * @return $this
63     */
64    public function byPermission(AccessLevel $accessLevel): static
65    {
66        $this->whereRaw(
67            "
68                EXISTS (
69                    SELECT 1
70                    FROM jsonb_each(users.access_level) AS kv(key, value)
71                    WHERE EXISTS (
72                        SELECT 1
73                        FROM jsonb_array_elements_text(kv.value) AS elem
74                        WHERE elem::int = ?
75                    )
76                )
77            ",
78            [$accessLevel->value]
79        );
80
81        return $this;
82    }
83}