repository
์ฉ๋
network ์์ ๋ง๋ค์ด์ค ํด๋ผ์ด์ธํธ๋ฅผ ํตํด์ ์๋ฒ์ ํต์ ํด์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๊ฐ์ ธ์ค๋ ์ฑ ์์ ๊ฐ์ง ๊ฐ์ฒด๋ค. ๋๋ฉ์ธ ๋ณ๋ก ๋๋ ์ ๊ฐ ๋๋ฉ์ธ์ ๋ํด์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ฒ๋ฆฌํ๋ ๋ฑ์ ์ฑ ์์ ์ํํ๋ค.
๊ตฌํ
ํด๋ฆฐ ์ํคํ ์ฒ ๊ฐ์์์ dartz ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ฒ์์ ์ข ์ด์ํ๋ค ์๊ฐํ๋๋ฐ ๋ง์ ํ๋ก์ ํธ์ ์จ๋ณด๋ ์๋ฌ ๋ฌ์๋์ ์ ์ ์ฒ๋ฆฌ๋ฅผ ๋ ๋ถ๋ช ํ๊ฒ ๊ตฌ๋ถํ ์ ์์ด์ ์ข์๋ค.
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 ์ ์ฃผ์ ) ์ฌ์ฉํ๋ค.
Last updated