import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import '../../../services/auth_service.dart'; import '../../../data/models/auth/login_request.dart'; import '../../../data/models/auth/login_response.dart'; import '../../../core/errors/failures.dart'; import '../base_usecase.dart'; /// 로그인 UseCase 파라미터 class LoginParams { final String email; final String password; const LoginParams({ required this.email, required this.password, }); } /// 로그인 UseCase /// 사용자 인증을 처리하고 토큰을 저장 class LoginUseCase extends UseCase { final AuthService _authService; LoginUseCase(this._authService); @override Future> call(LoginParams params) async { try { // 이메일 유효성 검증 if (!_isValidEmail(params.email)) { return Left(ValidationFailure( message: '올바른 이메일 형식이 아닙니다.', errors: {'email': '올바른 이메일 형식이 아닙니다.'}, )); } // 비밀번호 유효성 검증 if (params.password.isEmpty) { return Left(ValidationFailure( message: '비밀번호를 입력해주세요.', errors: {'password': '비밀번호를 입력해주세요.'}, )); } // 로그인 요청 final loginRequest = LoginRequest( email: params.email, password: params.password, ); return await _authService.login(loginRequest); } on DioException catch (e) { if (e.response?.statusCode == 401) { return Left(AuthFailure( message: '이메일 또는 비밀번호가 올바르지 않습니다.', code: 'INVALID_CREDENTIALS', originalError: e, )); } else if (e.type == DioExceptionType.connectionTimeout || e.type == DioExceptionType.receiveTimeout) { return Left(NetworkFailure( message: '네트워크 연결 시간이 초과되었습니다.', code: 'TIMEOUT', originalError: e, )); } else if (e.type == DioExceptionType.connectionError) { return Left(NetworkFailure( message: '서버에 연결할 수 없습니다.', code: 'CONNECTION_ERROR', originalError: e, )); } else { return Left(ServerFailure( message: e.response?.data['message'] ?? '서버 오류가 발생했습니다.', code: e.response?.statusCode?.toString(), originalError: e, )); } } catch (e) { return Left(UnknownFailure( message: '알 수 없는 오류가 발생했습니다.', originalError: e, )); } } bool _isValidEmail(String email) { final emailRegex = RegExp( r'^[a-zA-Z0-9.]+@[a-zA-Z0-9]+\.[a-zA-Z]+', ); return emailRegex.hasMatch(email); } }