repository
Last updated
Last updated
network μμ λ§λ€μ΄μ€ ν΄λΌμ΄μΈνΈλ₯Ό ν΅ν΄μ μλ²μ ν΅μ ν΄μ λ°μ΄ν°λ₯Ό μ§μ κ°μ Έμ€λ μ± μμ κ°μ§ κ°μ²΄λ€. λλ©μΈ λ³λ‘ λλ μ κ° λλ©μΈμ λν΄μ μλ²λ‘λΆν° λ°μ΄ν°λ₯Ό κ°μ Έμ μ²λ¦¬νλ λ±μ μ± μμ μννλ€.
ν΄λ¦° μν€ν μ² κ°μμμ λ₯Ό μ¬μ©νλλ° μ²μμ μ’ μ΄μνλ€ μκ°νλλ° λ§μ νλ‘μ νΈμ μ¨λ³΄λ μλ¬ λ¬μλμ μ μ μ²λ¦¬λ₯Ό λ λΆλͺ νκ² κ΅¬λΆν μ μμ΄μ μ’μλ€.
flutter pub add dartz
import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart';
import 'package:easy_localization/easy_localization.dart';
import '../../../../barrel.dart';
class UserRepositoryImpl extends UserRepository {
final Dio apiClient;
final ConnectionManager connectionManager;
UserRepositoryImpl({
required this.apiClient,
required this.connectionManager,
});
@override
Future<Either<AppException, bool>> replaceIsPushPermitted(
bool isPushPermitted) async {
final togglePushPermittedRequest =
apiClient.put('/user/push-permitted', queryParameters: {
'isPushPermitted': isPushPermitted,
});
try {
Response response = await togglePushPermittedRequest;
return Right(response.data['isPushPermitted'] as bool);
} catch (error) {
return Left(
AppException(TextManager.notificationToggleFailedMessage.tr()));
}
}
@override
Future<Either<AppException, void>> replacePushToken(String pushToken) async {
final replacePushTokenRequest = apiClient.put('/user/push-token');
try {
await replacePushTokenRequest;
return const Right(null);
} catch (error) {
return Left(AppException.basicError());
}
}
@override
Future<Either<AppException, bool>> appVersionCheck() async {
final appVersionCheck = apiClient.get('/app/version');
try {
final Response response = await appVersionCheck;
return Right(response.data['isForceUpdate']);
} catch (error) {
return Left(AppException(TextManager.appVersionCheckFailedMessage.tr()));
}
}
@override
Future<Either<AppException, void>> updateProfile(
UpdateProfileCommand command) async {
bool isConnected = await connectionManager.isConnected;
if (!isConnected) {
return Left(AppException(TextManager.internetNotConnected.tr()));
}
final Map<String, dynamic> jsonData = command.toJson();
final FormData formData;
if (command.profileImage != null) {
formData = FormData.fromMap({
'profileImage':
await MultipartFile.fromFile(command.profileImage!.path),
});
jsonData.forEach((key, value) {
formData.fields.add(MapEntry(key, value.toString()));
});
} else {
formData = FormData.fromMap(jsonData);
}
try {
await apiClient.put(
'/user/profile',
data: formData,
options: Options(
contentType: 'multipart/form-data',
),
);
return const Right(null);
} on DioException catch (error) {
return Left(AppException(TextManager.updateProfileFailedMessage.tr()));
}
}
@override
Future<Either<AppException, void>> quitService() async {
bool isConnected = await connectionManager.isConnected;
if (!isConnected) {
return Left(AppException(TextManager.internetNotConnected.tr()));
}
final minimumLatency = Future.delayed(const Duration(milliseconds: 700));
final quitServiceRequest = apiClient.delete('/user/quit');
try {
await Future.wait([minimumLatency, quitServiceRequest]);
return const Right(null);
} catch (error) {
return Left(AppException(TextManager.quitServiceFailedMessage.tr()));
}
}
@override
Future<Either<AppException, UserDetailModel>> getUserDetail() async {
bool isConnected = await connectionManager.isConnected;
if (!isConnected) {
return Left(AppException(TextManager.internetNotConnected.tr()));
}
final minimumLatency = Future.delayed(const Duration(milliseconds: 700));
final getUserDetailRequest = apiClient.get('/user/profile');
try {
await Future.wait([minimumLatency, getUserDetailRequest]);
Response response = await getUserDetailRequest;
UserDetailModel result = UserDetailModel.fromJson(response.data);
return Right(result);
} catch (error) {
return Left(AppException(TextManager.userDetailFailedMessage.tr()));
}
}
@override
Future<Either<AppException, SignInResponse>> signIn() async {
bool isConnected = await connectionManager.isConnected;
if (!isConnected) {
return Left(AppException(TextManager.internetNotConnected.tr()));
}
final minimumLatency = Future.delayed(const Duration(milliseconds: 700));
final signInRequest = apiClient.post('/user/token');
try {
await Future.wait([minimumLatency, signInRequest]);
} catch (error) {
return Left(AppException(TextManager.signInFailed.tr()));
}
Response signInResponse = await signInRequest;
return Right(SignInResponse.fromJson(signInResponse.data));
}
@override
Future<Either<AppException, SignInResponse>> continueWithSocial(
ContinueWithSocialQuery continueWithSocialQuery) async {
bool isConnected = await connectionManager.isConnected;
if (!isConnected) {
return Left(AppException(TextManager.internetNotConnected.tr()));
}
final minimumLatency = Future.delayed(const Duration(milliseconds: 700));
final continueWithSocialRequest =
apiClient.post('/user', data: continueWithSocialQuery.toJson());
try {
await Future.wait([minimumLatency, continueWithSocialRequest]);
} on DioException catch (error) {
return Left(AppException(TextManager.continueWithSocialFailed.tr()));
}
final Response continueWithSocialResponse = await continueWithSocialRequest;
return Right(SignInResponse.fromJson(continueWithSocialResponse.data));
}
@override
Future<Either<AppException, void>> completeOnBoarding(
CompleteOnBoardingCommand command) async {
bool isConnected = await connectionManager.isConnected;
if (!isConnected) {
return Left(AppException(TextManager.internetNotConnected.tr()));
}
final Map<String, dynamic> jsonData = command.toJson();
final FormData formData;
if (command.profileImage != null) {
formData = FormData.fromMap({
'profileImage':
await MultipartFile.fromFile(command.profileImage!.path),
});
jsonData.forEach((key, value) {
formData.fields.add(MapEntry(key, value.toString()));
});
} else {
formData = FormData.fromMap(jsonData);
}
try {
await apiClient.post(
'/user/profile',
data: formData,
options: Options(
contentType: 'multipart/form-data',
),
);
return const Right(null);
} on DioException catch (error) {
return Left(
AppException(TextManager.onboardingFailedExceptionContents.tr()));
}
}
}
λ€μν λ°μ΄ν° ν΅μ μΌμ΄μ€κ° μμ΄μ μΌλ¨ νλ‘μ νΈμ μ¬μ©ν μ½λλ₯Ό λ€ κ°μ Έμλ€. ν νλ¦Ώ μ½λμμλ μΈν°νμ΄μ€, ꡬν체λ₯Ό λλμ§ μκ³ data λ μ΄μ΄μ λ°λ‘ ꡬν체 νλλ§ μ¬μ©ν μμ μ΄λ€.
static _registerRepositories() async {
GetIt.instance.registerLazySingleton<UserRepository>(
() => UserRepository(
apiClient: apiClient,
connectionManager: connectionManager,
),
);
}
λ€λ₯Έ κ²λ€κ³Ό λ§μ°¬κ°μ§λ‘ Injector μ μμ κ°μ΄ μ μΈν ν νμν λ(= Bloc μ μ£Όμ ) μ¬μ©νλ€.