Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
96.77% covered (success)
96.77%
30 / 31
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ChangeAccessLevelService
96.77% covered (success)
96.77%
30 / 31
0.00% covered (danger)
0.00%
0 / 1
7
0.00% covered (danger)
0.00%
0 / 1
 generate
96.77% covered (success)
96.77%
30 / 31
0.00% covered (danger)
0.00%
0 / 1
7
1<?php
2
3namespace Domain\Login\Services;
4
5use App\Models\User;
6use Carbon\Carbon;
7use Domain\Login\DTOs\ChangeAccessLevelDTO;
8use Illuminate\Auth\AuthenticationException;
9use Illuminate\Support\Facades\Auth;
10use Illuminate\Support\Facades\Cache;
11use Illuminate\Support\Facades\Log;
12use Laravel\Sanctum\NewAccessToken;
13use function config;
14
15readonly class ChangeAccessLevelService
16{
17    /**
18     * @param ChangeAccessLevelDTO $changeAccessLevelDTO
19     * @return NewAccessToken
20     * @throws AuthenticationException
21     */
22    public static function generate(ChangeAccessLevelDTO $changeAccessLevelDTO): NewAccessToken
23    {
24        /** @var User $user */
25        $user = Auth::user();
26        $currentToken = $user->currentAccessToken();
27        $cachedErpPassword = $currentToken
28            ? Cache::get("erp_password_{$currentToken->id}")
29            : null;
30
31        $currentToken?->delete();
32
33        $sector     = $changeAccessLevelDTO->toArray()['sector'] ?? null;
34        $accesLevel = $changeAccessLevelDTO->toArray()['access_level'] ?? null;
35        $accesses   = $user->getAttribute('access_level');
36
37        if (!(isset($accesses[$sector]) && in_array($accesLevel, $accesses[$sector]))) {
38            throw new AuthenticationException(
39                __('The user is not associated with the access level: :accessLevel or with the sector: :sector.', [
40                    'accessLevel' => $changeAccessLevelDTO->toArray()['access_level'],
41                    'sector' => $changeAccessLevelDTO->toArray()['sector']
42                ])
43            );
44        }
45
46        $token = $user->createToken(
47            $user->getKey(),
48            [$sector => $changeAccessLevelDTO->toArray()['access_level']],
49            expiresAt: Carbon::now()->addMinutes(config('sanctum.expiration'))
50        );
51
52        if (is_string($cachedErpPassword) && trim($cachedErpPassword) !== '') {
53            Cache::put(
54                "erp_password_{$token->accessToken->id}",
55                $cachedErpPassword,
56                Carbon::now()->addMinutes(config('sanctum.expiration'))
57            );
58
59            if ($currentToken) {
60                Cache::forget("erp_password_{$currentToken->id}");
61            }
62        }
63
64        Log::channel('access')->info("Login efetuado: #{$user->getKey()} {$user->getAttribute('name')}");
65        return $token;
66    }
67}