Files
superport/lib/data/datasources/remote/auth_remote_datasource.dart
JiWoong Sul c573096d84 feat: API 인증 시스템 구현 및 로그인 화면 연동
- AuthService, AuthRemoteDataSource 구현
- JWT 토큰 관리 (SecureStorage 사용)
- 로그인 화면 API 연동 및 에러 처리
- freezed 패키지로 Auth 관련 DTO 모델 생성
- 의존성 주입 설정 업데이트
2025-07-24 15:14:53 +09:00

104 lines
3.4 KiB
Dart

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<Either<Failure, LoginResponse>> login(LoginRequest request);
Future<Either<Failure, void>> logout(LogoutRequest request);
Future<Either<Failure, TokenResponse>> refreshToken(RefreshTokenRequest request);
}
@LazySingleton(as: AuthRemoteDataSource)
class AuthRemoteDataSourceImpl implements AuthRemoteDataSource {
final ApiClient _apiClient;
AuthRemoteDataSourceImpl(this._apiClient);
@override
Future<Either<Failure, LoginResponse>> login(LoginRequest request) async {
try {
final response = await _apiClient.post(
'/auth/login',
data: request.toJson(),
);
if (response.success && response.data != null) {
final loginResponse = LoginResponse.fromJson(response.data);
return Right(loginResponse);
} else {
return Left(ServerFailure(
message: response.error?.message ?? '로그인 실패',
));
}
} 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<Either<Failure, void>> logout(LogoutRequest request) async {
try {
final response = await _apiClient.post(
'/auth/logout',
data: request.toJson(),
);
if (response.success) {
return const Right(null);
} else {
return Left(ServerFailure(
message: response.error?.message ?? '로그아웃 실패',
));
}
} catch (e) {
if (e is ApiException) {
return Left(ServerFailure(message: e.message));
}
return Left(ServerFailure(message: '로그아웃 중 오류가 발생했습니다.'));
}
}
@override
Future<Either<Failure, TokenResponse>> refreshToken(RefreshTokenRequest request) async {
try {
final response = await _apiClient.post(
'/auth/refresh',
data: request.toJson(),
);
if (response.success && response.data != null) {
final tokenResponse = TokenResponse.fromJson(response.data);
return Right(tokenResponse);
} else {
return Left(ServerFailure(
message: response.error?.message ?? '토큰 갱신 실패',
));
}
} catch (e) {
if (e is ApiException) {
if (e.statusCode == 401) {
return Left(AuthenticationFailure(
message: '인증이 만료되었습니다. 다시 로그인해주세요.',
));
}
return Left(ServerFailure(message: e.message));
}
return Left(ServerFailure(message: '토큰 갱신 중 오류가 발생했습니다.'));
}
}
}