$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, ]; }); } }