feat: API 인증 시스템 구현 및 로그인 화면 연동
- AuthService, AuthRemoteDataSource 구현 - JWT 토큰 관리 (SecureStorage 사용) - 로그인 화면 API 연동 및 에러 처리 - freezed 패키지로 Auth 관련 DTO 모델 생성 - 의존성 주입 설정 업데이트
This commit is contained in:
104
lib/data/datasources/remote/auth_remote_datasource.dart
Normal file
104
lib/data/datasources/remote/auth_remote_datasource.dart
Normal file
@@ -0,0 +1,104 @@
|
||||
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: '토큰 갱신 중 오류가 발생했습니다.'));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user