import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import '../../../services/auth_service.dart'; import '../../../data/models/auth/token_response.dart'; import '../../../core/errors/failures.dart'; import '../base_usecase.dart'; /// 토큰 갱신 UseCase /// JWT 토큰을 갱신하여 세션 유지 class RefreshTokenUseCase extends UseCase { final AuthService _authService; RefreshTokenUseCase(this._authService); @override Future> call(NoParams params) async { try { final refreshToken = await _authService.getRefreshToken(); if (refreshToken == null) { return Left(AuthFailure( message: '갱신 토큰이 없습니다. 다시 로그인해주세요.', code: 'NO_REFRESH_TOKEN', )); } return await _authService.refreshToken(); } on DioException catch (e) { if (e.response?.statusCode == 401) { return Left(AuthFailure( message: '세션이 만료되었습니다. 다시 로그인해주세요.', code: 'SESSION_EXPIRED', originalError: e, )); } else if (e.type == DioExceptionType.connectionTimeout || e.type == DioExceptionType.receiveTimeout) { return Left(NetworkFailure( message: '네트워크 연결 시간이 초과되었습니다.', code: 'TIMEOUT', originalError: e, )); } else { return Left(ServerFailure( message: '서버 오류가 발생했습니다.', code: e.response?.statusCode?.toString(), originalError: e, )); } } catch (e) { return Left(UnknownFailure( message: '토큰 갱신 중 오류가 발생했습니다.', originalError: e, )); } } }