$email, "password" => $password]) || (User::where("email", $email)->first()->type == 'CLIENT' || User::where("email", $email)->first()->type == 'PROVIDER')) { return null; } $user = User::where("email", $email)->first(); $deviceId = Str::uuid()->toString(); $accessToken = $user->createAccessToken($deviceId); $refreshToken = $user->createRefreshToken($deviceId); return [ "payload" => [ "access_token" => $accessToken, "user" => $user, ], "refreshToken" => $refreshToken, ]; } public function refresh(string $refreshToken): ?array { if (!$refreshToken) { return null; } $tokenModel = PersonalAccessToken::findToken($refreshToken); if ( !$tokenModel || !in_array("refresh", $tokenModel->abilities) || $tokenModel->expires_at < now() ) { return null; } $user = $tokenModel->tokenable; if (!$user) { return null; } $deviceId = Str::afterLast($tokenModel->name, "_"); $tokens = $this->refreshTokenTransaction($tokenModel, $user, $deviceId); return [ "payload" => [ "access_token" => $tokens["access_token"], "user" => $user, ], "refreshToken" => $tokens["refresh_token"], ]; } public function logout(): void { $user = Auth::user(); if (!$user) { return; } $tokenName = $user->currentAccessToken()->name; $deviceId = Str::afterLast($tokenName, "_"); $user ->tokens() ->where("name", "like", "%_{$deviceId}") ->delete(); } protected function refreshTokenTransaction( PersonalAccessToken $tokenModel, User $user, string $deviceId, ): array { return DB::transaction(function () use ( $tokenModel, $user, $deviceId, ): array { $tokenModel->update(["expires_at" => Carbon::now()]); $accessToken = $user->createAccessToken($deviceId); $refreshToken = $user->createRefreshToken($deviceId); return [ "access_token" => $accessToken, "refresh_token" => $refreshToken, ]; }); } public function sendCode(array $data): void { try { DB::beginTransaction(); $code = str_pad((string) random_int(0, 999999), 6, '0', STR_PAD_LEFT); $user = new User(); $user->fill($data); $user->code = $code; $user->name = $data['name'] ?? 'Usuário'; $user->type = $data['type'] ?? 'USER'; $user->save(); if (!empty($data['email'])) { $this->emailService->sendVerificationCode( email: $data['email'], code: $code, recipientName: $data['name'] ?? '', ); } elseif (!empty($data['phone'])) { Log::info('SMS: envio de código por telefone ainda não implementado.', [ 'phone' => $data['phone'], ]); } DB::commit(); return; } catch (\Exception $e) { DB::rollBack(); Log::error('Erro ao enviar código de verificação.', [ 'error' => $e->getMessage(), 'data' => $data, ]); return; } } public function validateCode(array $data): Bool { $email = $data['email'] ?? null; $phone = $data['phone'] ?? null; $code = $data['code'] ?? ''; $user = User::where(function ($query) use ($email, $phone) { $query->when($email, function ($q) use ($email) { $q->where('email', $email); }) ->when($phone, function ($q) use ($phone) { $q->where('phone', $phone); }); }) ->where('code', $code) ->first(); Log::info($user); if (!$user) { return false; } // $user->code = null; // $user->validated_code = true; // $user->save(); return true; } public function loginWithEmail(string $email, string $code): ?array { $user = User::where('email', $email) ->where('code', $code) ->first(); if (!$user) { return null; } $deviceId = Str::uuid()->toString(); $accessToken = $user->createAccessTokenApp($deviceId); $refreshToken = $user->createRefreshTokenApp($deviceId); $user->validated_code = true; $user->code = null; $user->save(); return [ "payload" => [ "access_token" => $accessToken, "user" => $user, ], "refreshToken" => $refreshToken, ]; } }