- AuthService, AuthRemoteDataSource 구현 - JWT 토큰 관리 (SecureStorage 사용) - 로그인 화면 API 연동 및 에러 처리 - freezed 패키지로 Auth 관련 DTO 모델 생성 - 의존성 주입 설정 업데이트
104 lines
3.4 KiB
Dart
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: '토큰 갱신 중 오류가 발생했습니다.'));
|
|
}
|
|
}
|
|
} |