import 'package:dartz/dartz.dart'; import 'package:injectable/injectable.dart'; import 'package:superport/core/errors/exceptions.dart'; import 'package:superport/core/errors/failures.dart'; import 'package:superport/data/datasources/remote/api_client.dart'; import 'package:superport/data/models/auth/login_request.dart'; import 'package:superport/data/models/auth/login_response.dart'; import 'package:superport/data/models/auth/logout_request.dart'; import 'package:superport/data/models/auth/refresh_token_request.dart'; import 'package:superport/data/models/auth/token_response.dart'; abstract class AuthRemoteDataSource { Future> login(LoginRequest request); Future> logout(LogoutRequest request); Future> refreshToken(RefreshTokenRequest request); } @LazySingleton(as: AuthRemoteDataSource) class AuthRemoteDataSourceImpl implements AuthRemoteDataSource { final ApiClient _apiClient; AuthRemoteDataSourceImpl(this._apiClient); @override Future> login(LoginRequest request) async { try { final response = await _apiClient.post( '/auth/login', data: request.toJson(), ); if (response.statusCode == 200 && response.data != null) { final loginResponse = LoginResponse.fromJson(response.data); return Right(loginResponse); } else { return Left(ServerFailure( message: response.statusMessage ?? '로그인 실패', )); } } catch (e) { if (e is ApiException) { if (e.statusCode == 401) { return Left(AuthenticationFailure( message: '이메일 또는 비밀번호가 올바르지 않습니다.', )); } return Left(ServerFailure(message: e.message)); } return Left(ServerFailure(message: '로그인 중 오류가 발생했습니다.')); } } @override Future> logout(LogoutRequest request) async { try { final response = await _apiClient.post( '/auth/logout', data: request.toJson(), ); if (response.statusCode == 200) { return const Right(null); } else { return Left(ServerFailure( message: response.statusMessage ?? '로그아웃 실패', )); } } catch (e) { if (e is ApiException) { return Left(ServerFailure(message: e.message)); } return Left(ServerFailure(message: '로그아웃 중 오류가 발생했습니다.')); } } @override Future> refreshToken(RefreshTokenRequest request) async { try { final response = await _apiClient.post( '/auth/refresh', data: request.toJson(), ); if (response.statusCode == 200 && response.data != null) { final tokenResponse = TokenResponse.fromJson(response.data); return Right(tokenResponse); } else { return Left(ServerFailure( message: response.statusMessage ?? '토큰 갱신 실패', )); } } catch (e) { if (e is ApiException) { if (e.statusCode == 401) { return Left(AuthenticationFailure( message: '인증이 만료되었습니다. 다시 로그인해주세요.', )); } return Left(ServerFailure(message: e.message)); } return Left(ServerFailure(message: '토큰 갱신 중 오류가 발생했습니다.')); } } }