repository
์ฉ๋
network ์์ ๋ง๋ค์ด์ค ํด๋ผ์ด์ธํธ๋ฅผ ํตํด์ ์๋ฒ์ ํต์ ํด์ ๋ฐ์ดํฐ๋ฅผ ์ง์  ๊ฐ์ ธ์ค๋ ์ฑ ์์ ๊ฐ์ง ๊ฐ์ฒด๋ค. ๋๋ฉ์ธ ๋ณ๋ก ๋๋ ์ ๊ฐ ๋๋ฉ์ธ์ ๋ํด์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ฒ๋ฆฌํ๋ ๋ฑ์ ์ฑ ์์ ์ํํ๋ค.
๊ตฌํ
ํด๋ฆฐ ์ํคํ ์ฒ ๊ฐ์์์ dartz ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ฒ์์ ์ข ์ด์ํ๋ค ์๊ฐํ๋๋ฐ ๋ง์ ํ๋ก์ ํธ์ ์จ๋ณด๋ ์๋ฌ ๋ฌ์๋์ ์ ์ ์ฒ๋ฆฌ๋ฅผ ๋ ๋ถ๋ช ํ๊ฒ ๊ตฌ๋ถํ ์ ์์ด์ ์ข์๋ค.
flutter pub add dartzimport '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