From b09de6c464d25e41d354e3c9c7a65e4260384500 Mon Sep 17 00:00:00 2001 From: jihye Date: Sun, 17 Dec 2023 18:23:56 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20[User]=20=EC=9C=A0=EC=A0=80=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/api/user_api.dart | 40 +- lib/api/user_api.g.dart | 77 +++ lib/app/di/modules/user_di.dart | 33 ++ .../providers/app_user_auth_provider.dart | 42 -- .../providers/app_user_data_provider.dart | 33 -- .../providers/app_user_data_provider.g.dart | 25 - .../user/data/models/user_data_model.dart | 23 + .../data/models/user_data_model.freezed.dart | 288 +++++++++++ .../user/data/models/user_data_model.g.dart | 29 ++ .../data/remote/user_remote_data_source.dart | 5 + .../remote/user_remote_data_source_impl.dart | 16 + .../existing_user_profile_provider.dart | 0 .../provider/user_profile_info_provider.dart | 65 --- lib/features/user/domain/user_data_model.dart | 23 - .../user/domain/user_data_model.freezed.dart | 464 ------------------ lib/features/user/domain/user_info_dto.dart | 44 -- .../user/domain/user_info_dto.freezed.dart | 305 ------------ lib/features/user/domain/user_info_dto.g.dart | 38 -- .../user/entities/user_data_entity.dart | 64 +++ .../user/repositories/user_repository.dart | 7 + .../repositories/user_repository_impl.dart | 31 ++ .../user/usecases/get_user_data_use_case.dart | 14 + lib/features/user/user.dart | 12 + .../providers/user/user_auth_provider.dart | 19 + .../providers/user/user_auth_provider.g.dart | 43 ++ .../providers/user/user_data_provider.dart | 22 + .../providers/user/user_data_provider.g.dart | 25 + 27 files changed, 717 insertions(+), 1070 deletions(-) create mode 100644 lib/api/user_api.g.dart create mode 100644 lib/app/di/modules/user_di.dart delete mode 100644 lib/features/auth/domain/providers/app_user_auth_provider.dart delete mode 100644 lib/features/auth/domain/providers/app_user_data_provider.dart delete mode 100644 lib/features/auth/domain/providers/app_user_data_provider.g.dart create mode 100644 lib/features/user/data/models/user_data_model.dart create mode 100644 lib/features/user/data/models/user_data_model.freezed.dart create mode 100644 lib/features/user/data/models/user_data_model.g.dart create mode 100644 lib/features/user/data/remote/user_remote_data_source.dart create mode 100644 lib/features/user/data/remote/user_remote_data_source_impl.dart delete mode 100644 lib/features/user/domain/provider/existing_user_profile_provider.dart delete mode 100644 lib/features/user/domain/provider/user_profile_info_provider.dart delete mode 100644 lib/features/user/domain/user_data_model.dart delete mode 100644 lib/features/user/domain/user_data_model.freezed.dart delete mode 100644 lib/features/user/domain/user_info_dto.dart delete mode 100644 lib/features/user/domain/user_info_dto.freezed.dart delete mode 100644 lib/features/user/domain/user_info_dto.g.dart create mode 100644 lib/features/user/entities/user_data_entity.dart create mode 100644 lib/features/user/repositories/user_repository.dart create mode 100644 lib/features/user/repositories/user_repository_impl.dart create mode 100644 lib/features/user/usecases/get_user_data_use_case.dart create mode 100644 lib/features/user/user.dart create mode 100644 lib/presentation/providers/user/user_auth_provider.dart create mode 100644 lib/presentation/providers/user/user_auth_provider.g.dart create mode 100644 lib/presentation/providers/user/user_data_provider.dart create mode 100644 lib/presentation/providers/user/user_data_provider.g.dart diff --git a/lib/api/user_api.dart b/lib/api/user_api.dart index 64ea975..b14329b 100644 --- a/lib/api/user_api.dart +++ b/lib/api/user_api.dart @@ -1,35 +1,13 @@ -import 'package:pets_next_door_flutter/features/sign_up/domain/profile_form.dart'; +import 'package:dio/dio.dart'; +import 'package:pets_next_door_flutter/features/user/data/models/user_data_model.dart'; +import 'package:retrofit/retrofit.dart'; -/// Uri builder class for the UserAPI -class UserAPI { - UserAPI(this._apiBaseUrl); - final String _apiBaseUrl; +part 'user_api.g.dart'; - static const String _apiPath = '/user/'; +@RestApi() +abstract class UserAPI { + factory UserAPI(Dio dio, {String baseUrl}) = _UserAPI; - Uri register(ProfileForm registrationInfo) => - _buildUri(endpoint: 'register', parametersBuilder: () => {}); - - Uri _buildUri({ - required String endpoint, - required Map Function() parametersBuilder, - }) { - return Uri( - scheme: 'https', - host: _apiBaseUrl, - path: '$_apiPath$endpoint', - queryParameters: parametersBuilder(), - ); - } - - // Map registerationQueryParameters( - // RegistrationInfo registerationInfo, - // ) => - // { - // 'email': registerationInfo.userInfo.email, - // 'fbProviderType': registerationInfo.userInfo.providerType.name, - // 'fbUid': registerationInfo.firebaseUid, - // 'fullname': registerationInfo.fullname, - // 'nickname': registerationInfo.nickname, - // }; + @GET("/users/me") + Future getUserData(); } diff --git a/lib/api/user_api.g.dart b/lib/api/user_api.g.dart new file mode 100644 index 0000000..a42c5a0 --- /dev/null +++ b/lib/api/user_api.g.dart @@ -0,0 +1,77 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_api.dart'; + +// ************************************************************************** +// RetrofitGenerator +// ************************************************************************** + +// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers + +class _UserAPI implements UserAPI { + _UserAPI( + this._dio, { + this.baseUrl, + }); + + final Dio _dio; + + String? baseUrl; + + @override + Future getUserData() async { + const _extra = {}; + final queryParameters = {}; + final _headers = {}; + final Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'GET', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/users/me', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = UserDataModel.fromJson(_result.data!); + return value; + } + + RequestOptions _setStreamType(RequestOptions requestOptions) { + if (T != dynamic && + !(requestOptions.responseType == ResponseType.bytes || + requestOptions.responseType == ResponseType.stream)) { + if (T == String) { + requestOptions.responseType = ResponseType.plain; + } else { + requestOptions.responseType = ResponseType.json; + } + } + return requestOptions; + } + + String _combineBaseUrls( + String dioBaseUrl, + String? baseUrl, + ) { + if (baseUrl == null || baseUrl.trim().isEmpty) { + return dioBaseUrl; + } + + final url = Uri.parse(baseUrl); + + if (url.isAbsolute) { + return url.toString(); + } + + return Uri.parse(dioBaseUrl).resolveUri(url).toString(); + } +} diff --git a/lib/app/di/modules/user_di.dart b/lib/app/di/modules/user_di.dart new file mode 100644 index 0000000..7dec4c6 --- /dev/null +++ b/lib/app/di/modules/user_di.dart @@ -0,0 +1,33 @@ +import 'package:get_it/get_it.dart'; +import 'package:pets_next_door_flutter/app/di/feature_di_interface.dart'; +import 'package:pets_next_door_flutter/features/user/data/remote/user_remote_data_source_impl.dart'; +import 'package:pets_next_door_flutter/features/user/repositories/user_repository_impl.dart'; +import 'package:pets_next_door_flutter/features/user/user.dart'; + +final class UserDependencyInjection extends FeatureDependencyInjection { + @override + void dataSources() { + GetIt.I.registerLazySingleton( + UserRemoteDataSourceImpl.new, + ); + } + + @override + void repositories() { + GetIt.I.registerLazySingleton( + () => UserRepositoryImpl( + userRemoteDataSource, + ), + ); + } + + @override + void useCases() { + GetIt.I + ..registerFactory( + () => GetUserDataUseCase( + userRepository, + ), + ); + } +} diff --git a/lib/features/auth/domain/providers/app_user_auth_provider.dart b/lib/features/auth/domain/providers/app_user_auth_provider.dart deleted file mode 100644 index d863e5d..0000000 --- a/lib/features/auth/domain/providers/app_user_auth_provider.dart +++ /dev/null @@ -1,42 +0,0 @@ -// import 'dart:async'; - -// import 'package:firebase_auth/firebase_auth.dart'; -// import 'package:riverpod_annotation/riverpod_annotation.dart'; -// import 'package:techtalk/app/di/locator.dart'; -// import 'package:techtalk/core/core.dart'; -// import 'package:techtalk/features/auth/auth.dart'; - -// part 'app_user_auth_provider.g.dart'; - -// /// 앱 사용자 권한 프로바이더 -// /// -// /// 인증, 로그인, 로그아웃 등의 기능을 담당한다. -// @Riverpod(keepAlive: true) -// class AppUserAuth extends _$AppUserAuth { -// final _signInOAuthUseCase = locator(); -// final _signOutUseCase = locator(); - -// @override -// User? build() { -// return FirebaseAuth.instance.currentUser; -// } - -// /// OAuth 인증을 통해 로그인한다. -// Future signInOAuth(UserAccountProvider provider) async { -// await _signInOAuthUseCase(provider); -// ref.invalidateSelf(); -// } - -// /// 로그아웃을 시도한다. -// Future signOut() async { -// await _signOutUseCase(); -// ref.invalidateSelf(); -// } -// } - -// /// 현재 앱 사용자가 인증되었는지 여부 -// /// -// /// * 현재는 단순 유저정보가 있나 없나로 판단. 테스트 후 다른 조건이 필요한지 찾아볼 것 -// @riverpod -// bool isUserAuthorized(IsUserAuthorizedRef ref) => -// ref.watch(appUserAuthProvider) != null; diff --git a/lib/features/auth/domain/providers/app_user_data_provider.dart b/lib/features/auth/domain/providers/app_user_data_provider.dart deleted file mode 100644 index 8cf92ec..0000000 --- a/lib/features/auth/domain/providers/app_user_data_provider.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:pets_next_door_flutter/features/sign_up/domain/profile_form.dart'; -import 'package:pets_next_door_flutter/features/user/domain/user_data_model.dart'; -import 'package:pets_next_door_flutter/presentation/pages/user/layout/text_form_state.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; - -part 'app_user_data_provider.g.dart'; - -@Riverpod(keepAlive: true) -class AppUserData extends _$AppUserData { - @override - UserDataEntity? build() { - // final userAuth = ref.watch(appUserAuthProvider); - - // if (userAuth == null) return null; - - // final userData = await _getUserDataUseCase(userAuth.uid); - - // TODO: firebaseuid로 가져오기 - - if (FirebaseAuth.instance.currentUser == null) return null; - - return _getUserData(FirebaseAuth.instance.currentUser?.uid); - } - - UserDataEntity? _getUserData(String? uid) { - if (uid == null) return null; - return UserDataEntity.existUser( - firebaseUid: 'asjdfiojad', - userProfile: - ProfileForm(nickname: TextFormState.valid('기존유저닉네임'), pets: [])); - } -} diff --git a/lib/features/auth/domain/providers/app_user_data_provider.g.dart b/lib/features/auth/domain/providers/app_user_data_provider.g.dart deleted file mode 100644 index 1f20d92..0000000 --- a/lib/features/auth/domain/providers/app_user_data_provider.g.dart +++ /dev/null @@ -1,25 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'app_user_data_provider.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$appUserDataHash() => r'9e00b2ba155fe9f752c3d25569a12098a084d7f6'; - -/// See also [AppUserData]. -@ProviderFor(AppUserData) -final appUserDataProvider = - NotifierProvider.internal( - AppUserData.new, - name: r'appUserDataProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$appUserDataHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$AppUserData = Notifier; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member diff --git a/lib/features/user/data/models/user_data_model.dart b/lib/features/user/data/models/user_data_model.dart new file mode 100644 index 0000000..7ad010d --- /dev/null +++ b/lib/features/user/data/models/user_data_model.dart @@ -0,0 +1,23 @@ +// ignore_for_file: invalid_annotation_target + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'user_data_model.freezed.dart'; +part 'user_data_model.g.dart'; + +/// api 통신을 통해 가져오는 유저 데이터 모델 +@freezed +class UserDataModel with _$UserDataModel { + const factory UserDataModel({ + required String id, + required String email, + @JsonKey(name: 'fbProviderType') required String firebaseProviderType, + @JsonKey(name: 'fbUid') required String firebaseUid, + required String fullname, + required String nickname, + String? profileImageUrl, + }) = _UserDataModel; + + factory UserDataModel.fromJson(Map json) => + _$UserDataModelFromJson(json); +} diff --git a/lib/features/user/data/models/user_data_model.freezed.dart b/lib/features/user/data/models/user_data_model.freezed.dart new file mode 100644 index 0000000..28612da --- /dev/null +++ b/lib/features/user/data/models/user_data_model.freezed.dart @@ -0,0 +1,288 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'user_data_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +UserDataModel _$UserDataModelFromJson(Map json) { + return _UserDataModel.fromJson(json); +} + +/// @nodoc +mixin _$UserDataModel { + String get email => throw _privateConstructorUsedError; + @JsonKey(name: 'fbProviderType') + String get firebaseProviderType => throw _privateConstructorUsedError; + @JsonKey(name: 'fbUid') + String get firebaseUid => throw _privateConstructorUsedError; + String get fullname => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get nickname => throw _privateConstructorUsedError; + String? get profileImageUrl => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $UserDataModelCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $UserDataModelCopyWith<$Res> { + factory $UserDataModelCopyWith( + UserDataModel value, $Res Function(UserDataModel) then) = + _$UserDataModelCopyWithImpl<$Res, UserDataModel>; + @useResult + $Res call( + {String email, + @JsonKey(name: 'fbProviderType') String firebaseProviderType, + @JsonKey(name: 'fbUid') String firebaseUid, + String fullname, + String id, + String nickname, + String? profileImageUrl}); +} + +/// @nodoc +class _$UserDataModelCopyWithImpl<$Res, $Val extends UserDataModel> + implements $UserDataModelCopyWith<$Res> { + _$UserDataModelCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? email = null, + Object? firebaseProviderType = null, + Object? firebaseUid = null, + Object? fullname = null, + Object? id = null, + Object? nickname = null, + Object? profileImageUrl = freezed, + }) { + return _then(_value.copyWith( + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + firebaseProviderType: null == firebaseProviderType + ? _value.firebaseProviderType + : firebaseProviderType // ignore: cast_nullable_to_non_nullable + as String, + firebaseUid: null == firebaseUid + ? _value.firebaseUid + : firebaseUid // ignore: cast_nullable_to_non_nullable + as String, + fullname: null == fullname + ? _value.fullname + : fullname // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + nickname: null == nickname + ? _value.nickname + : nickname // ignore: cast_nullable_to_non_nullable + as String, + profileImageUrl: freezed == profileImageUrl + ? _value.profileImageUrl + : profileImageUrl // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$_UserDataModelCopyWith<$Res> + implements $UserDataModelCopyWith<$Res> { + factory _$$_UserDataModelCopyWith( + _$_UserDataModel value, $Res Function(_$_UserDataModel) then) = + __$$_UserDataModelCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String email, + @JsonKey(name: 'fbProviderType') String firebaseProviderType, + @JsonKey(name: 'fbUid') String firebaseUid, + String fullname, + String id, + String nickname, + String? profileImageUrl}); +} + +/// @nodoc +class __$$_UserDataModelCopyWithImpl<$Res> + extends _$UserDataModelCopyWithImpl<$Res, _$_UserDataModel> + implements _$$_UserDataModelCopyWith<$Res> { + __$$_UserDataModelCopyWithImpl( + _$_UserDataModel _value, $Res Function(_$_UserDataModel) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? email = null, + Object? firebaseProviderType = null, + Object? firebaseUid = null, + Object? fullname = null, + Object? id = null, + Object? nickname = null, + Object? profileImageUrl = freezed, + }) { + return _then(_$_UserDataModel( + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + firebaseProviderType: null == firebaseProviderType + ? _value.firebaseProviderType + : firebaseProviderType // ignore: cast_nullable_to_non_nullable + as String, + firebaseUid: null == firebaseUid + ? _value.firebaseUid + : firebaseUid // ignore: cast_nullable_to_non_nullable + as String, + fullname: null == fullname + ? _value.fullname + : fullname // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + nickname: null == nickname + ? _value.nickname + : nickname // ignore: cast_nullable_to_non_nullable + as String, + profileImageUrl: freezed == profileImageUrl + ? _value.profileImageUrl + : profileImageUrl // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$_UserDataModel implements _UserDataModel { + const _$_UserDataModel( + {required this.email, + @JsonKey(name: 'fbProviderType') required this.firebaseProviderType, + @JsonKey(name: 'fbUid') required this.firebaseUid, + required this.fullname, + required this.id, + required this.nickname, + this.profileImageUrl}); + + factory _$_UserDataModel.fromJson(Map json) => + _$$_UserDataModelFromJson(json); + + @override + final String email; + @override + @JsonKey(name: 'fbProviderType') + final String firebaseProviderType; + @override + @JsonKey(name: 'fbUid') + final String firebaseUid; + @override + final String fullname; + @override + final String id; + @override + final String nickname; + @override + final String? profileImageUrl; + + @override + String toString() { + return 'UserDataModel(email: $email, firebaseProviderType: $firebaseProviderType, firebaseUid: $firebaseUid, fullname: $fullname, id: $id, nickname: $nickname, profileImageUrl: $profileImageUrl)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$_UserDataModel && + (identical(other.email, email) || other.email == email) && + (identical(other.firebaseProviderType, firebaseProviderType) || + other.firebaseProviderType == firebaseProviderType) && + (identical(other.firebaseUid, firebaseUid) || + other.firebaseUid == firebaseUid) && + (identical(other.fullname, fullname) || + other.fullname == fullname) && + (identical(other.id, id) || other.id == id) && + (identical(other.nickname, nickname) || + other.nickname == nickname) && + (identical(other.profileImageUrl, profileImageUrl) || + other.profileImageUrl == profileImageUrl)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, email, firebaseProviderType, + firebaseUid, fullname, id, nickname, profileImageUrl); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$_UserDataModelCopyWith<_$_UserDataModel> get copyWith => + __$$_UserDataModelCopyWithImpl<_$_UserDataModel>(this, _$identity); + + @override + Map toJson() { + return _$$_UserDataModelToJson( + this, + ); + } +} + +abstract class _UserDataModel implements UserDataModel { + const factory _UserDataModel( + {required final String email, + @JsonKey(name: 'fbProviderType') + required final String firebaseProviderType, + @JsonKey(name: 'fbUid') required final String firebaseUid, + required final String fullname, + required final String id, + required final String nickname, + final String? profileImageUrl}) = _$_UserDataModel; + + factory _UserDataModel.fromJson(Map json) = + _$_UserDataModel.fromJson; + + @override + String get email; + @override + @JsonKey(name: 'fbProviderType') + String get firebaseProviderType; + @override + @JsonKey(name: 'fbUid') + String get firebaseUid; + @override + String get fullname; + @override + String get id; + @override + String get nickname; + @override + String? get profileImageUrl; + @override + @JsonKey(ignore: true) + _$$_UserDataModelCopyWith<_$_UserDataModel> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/features/user/data/models/user_data_model.g.dart b/lib/features/user/data/models/user_data_model.g.dart new file mode 100644 index 0000000..215826d --- /dev/null +++ b/lib/features/user/data/models/user_data_model.g.dart @@ -0,0 +1,29 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_data_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$_UserDataModel _$$_UserDataModelFromJson(Map json) => + _$_UserDataModel( + email: json['email'] as String, + firebaseProviderType: json['fbProviderType'] as String, + firebaseUid: json['fbUid'] as String, + fullname: json['fullname'] as String, + id: json['id'] as String, + nickname: json['nickname'] as String, + profileImageUrl: json['profileImageUrl'] as String?, + ); + +Map _$$_UserDataModelToJson(_$_UserDataModel instance) => + { + 'email': instance.email, + 'fbProviderType': instance.firebaseProviderType, + 'fbUid': instance.firebaseUid, + 'fullname': instance.fullname, + 'id': instance.id, + 'nickname': instance.nickname, + 'profileImageUrl': instance.profileImageUrl, + }; diff --git a/lib/features/user/data/remote/user_remote_data_source.dart b/lib/features/user/data/remote/user_remote_data_source.dart new file mode 100644 index 0000000..33d8cb1 --- /dev/null +++ b/lib/features/user/data/remote/user_remote_data_source.dart @@ -0,0 +1,5 @@ +import 'package:pets_next_door_flutter/features/user/data/models/user_data_model.dart'; + +abstract interface class UserRemoteDataSource { + Future getUserData(String uid); +} diff --git a/lib/features/user/data/remote/user_remote_data_source_impl.dart b/lib/features/user/data/remote/user_remote_data_source_impl.dart new file mode 100644 index 0000000..3fbc717 --- /dev/null +++ b/lib/features/user/data/remote/user_remote_data_source_impl.dart @@ -0,0 +1,16 @@ +import 'package:dio/dio.dart'; +import 'package:pets_next_door_flutter/api/user_api.dart'; +import 'package:pets_next_door_flutter/features/user/data/models/user_data_model.dart'; +import 'package:pets_next_door_flutter/features/user/data/remote/user_remote_data_source.dart'; + +final class UserRemoteDataSourceImpl implements UserRemoteDataSource { + final UserAPI _userAPI = UserAPI(Dio(), baseUrl: ''); + + @override + Future getUserData(String uid) async { + // TODO: 후에 API에서 header 정보로 자동으로 주는지 uid 값을 파라미터로 받는지 확인 필요 + final userData = await _userAPI.getUserData(); + + return userData; + } +} diff --git a/lib/features/user/domain/provider/existing_user_profile_provider.dart b/lib/features/user/domain/provider/existing_user_profile_provider.dart deleted file mode 100644 index e69de29..0000000 diff --git a/lib/features/user/domain/provider/user_profile_info_provider.dart b/lib/features/user/domain/provider/user_profile_info_provider.dart deleted file mode 100644 index fc3472d..0000000 --- a/lib/features/user/domain/provider/user_profile_info_provider.dart +++ /dev/null @@ -1,65 +0,0 @@ -// import 'package:flutter_riverpod/flutter_riverpod.dart'; -// import 'package:pets_next_door_flutter/src/features/pet/domain/pet.dart'; -// import 'package:pets_next_door_flutter/src/features/sign_up/domain/sign_up_info.dart'; -// import 'package:pets_next_door_flutter/src/features/user/domain/user_info.dart'; - -// final userProfileInfoStateProvider = StateNotifierProvider.autoDispose -// .family( -// (ref, userInfo) { -// return UserProfileInfoNotifier( -// userInfo: userInfo, -// ); -// }, -// ); - -// class UserProfileInfoNotifier extends StateNotifier { -// UserProfileInfoNotifier({ -// required UserInfo userInf -// nickname: userInfo.nickname, -// profileImageId: userInfo.profileImageId, -// pets: userInfo.pets, -// ), -// ); - -// void setNickname(String nickname) { -// state = state.copyWith( -// nickname: nickname, -// ); -// } - -// void setPetList(List petList) { -// state = state.copyWith(pets: petList); -// } -// } - -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pets_next_door_flutter/core/constants/enums.dart'; -import 'package:pets_next_door_flutter/features/pet/domain/pet.dart'; - -final petListNotifierProvider = NotifierProvider>( - PetListNotifier.new, -); - -class PetListNotifier extends Notifier> { - @override - List build() { - return [ - Pet( - name: '콩이', - petType: PetType.dog, - neutered: true, - breed: '비숑프리제', - birthDate: DateTime.now(), - weight: 3.5, - ), - ]; - } - - void addPet(Pet newPet) { - state.add(newPet); - } - - void deletePet(int index) { - state.removeAt(index); - } -} diff --git a/lib/features/user/domain/user_data_model.dart b/lib/features/user/domain/user_data_model.dart deleted file mode 100644 index b38ac25..0000000 --- a/lib/features/user/domain/user_data_model.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:pets_next_door_flutter/features/auth/domain/sns_oauth_info.dart'; -import 'package:pets_next_door_flutter/features/sign_up/domain/profile_form.dart'; -import 'package:pets_next_door_flutter/presentation/pages/user/layout/text_form_state.dart'; - -part 'user_data_model.freezed.dart'; - -@freezed -sealed class UserDataEntity with _$UserDataEntity { - const UserDataEntity._(); - - const factory UserDataEntity.newUser({ - required SnsOAuthInfo snsOAuthInfo, - @Default(ProfileForm()) ProfileForm userProfile, - }) = UserDataEntityNewUser; - - const factory UserDataEntity.existUser({ - @JsonKey(name: 'fbUid') required String firebaseUid, - @Default(ProfileForm()) ProfileForm userProfile, - }) = UserDataEntityExistUser; - - bool get isNicknameValid => userProfile.nickname is TextFormStateValid; -} diff --git a/lib/features/user/domain/user_data_model.freezed.dart b/lib/features/user/domain/user_data_model.freezed.dart deleted file mode 100644 index b9bab35..0000000 --- a/lib/features/user/domain/user_data_model.freezed.dart +++ /dev/null @@ -1,464 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'user_data_model.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); - -/// @nodoc -mixin _$UserDataEntity { - ProfileForm get userProfile => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function( - SnsOAuthInfo snsOAuthInfo, ProfileForm userProfile) - newUser, - required TResult Function( - @JsonKey(name: 'fbUid') String firebaseUid, ProfileForm userProfile) - existUser, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(SnsOAuthInfo snsOAuthInfo, ProfileForm userProfile)? - newUser, - TResult? Function(@JsonKey(name: 'fbUid') String firebaseUid, - ProfileForm userProfile)? - existUser, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(SnsOAuthInfo snsOAuthInfo, ProfileForm userProfile)? - newUser, - TResult Function(@JsonKey(name: 'fbUid') String firebaseUid, - ProfileForm userProfile)? - existUser, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(UserDataEntityNewUser value) newUser, - required TResult Function(UserDataEntityExistUser value) existUser, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(UserDataEntityNewUser value)? newUser, - TResult? Function(UserDataEntityExistUser value)? existUser, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(UserDataEntityNewUser value)? newUser, - TResult Function(UserDataEntityExistUser value)? existUser, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - - @JsonKey(ignore: true) - $UserDataEntityCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $UserDataEntityCopyWith<$Res> { - factory $UserDataEntityCopyWith( - UserDataEntity value, $Res Function(UserDataEntity) then) = - _$UserDataEntityCopyWithImpl<$Res, UserDataEntity>; - @useResult - $Res call({ProfileForm userProfile}); - - $ProfileFormCopyWith<$Res> get userProfile; -} - -/// @nodoc -class _$UserDataEntityCopyWithImpl<$Res, $Val extends UserDataEntity> - implements $UserDataEntityCopyWith<$Res> { - _$UserDataEntityCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? userProfile = null, - }) { - return _then(_value.copyWith( - userProfile: null == userProfile - ? _value.userProfile - : userProfile // ignore: cast_nullable_to_non_nullable - as ProfileForm, - ) as $Val); - } - - @override - @pragma('vm:prefer-inline') - $ProfileFormCopyWith<$Res> get userProfile { - return $ProfileFormCopyWith<$Res>(_value.userProfile, (value) { - return _then(_value.copyWith(userProfile: value) as $Val); - }); - } -} - -/// @nodoc -abstract class _$$UserDataEntityNewUserCopyWith<$Res> - implements $UserDataEntityCopyWith<$Res> { - factory _$$UserDataEntityNewUserCopyWith(_$UserDataEntityNewUser value, - $Res Function(_$UserDataEntityNewUser) then) = - __$$UserDataEntityNewUserCopyWithImpl<$Res>; - @override - @useResult - $Res call({SnsOAuthInfo snsOAuthInfo, ProfileForm userProfile}); - - $SnsOAuthInfoCopyWith<$Res> get snsOAuthInfo; - @override - $ProfileFormCopyWith<$Res> get userProfile; -} - -/// @nodoc -class __$$UserDataEntityNewUserCopyWithImpl<$Res> - extends _$UserDataEntityCopyWithImpl<$Res, _$UserDataEntityNewUser> - implements _$$UserDataEntityNewUserCopyWith<$Res> { - __$$UserDataEntityNewUserCopyWithImpl(_$UserDataEntityNewUser _value, - $Res Function(_$UserDataEntityNewUser) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? snsOAuthInfo = null, - Object? userProfile = null, - }) { - return _then(_$UserDataEntityNewUser( - snsOAuthInfo: null == snsOAuthInfo - ? _value.snsOAuthInfo - : snsOAuthInfo // ignore: cast_nullable_to_non_nullable - as SnsOAuthInfo, - userProfile: null == userProfile - ? _value.userProfile - : userProfile // ignore: cast_nullable_to_non_nullable - as ProfileForm, - )); - } - - @override - @pragma('vm:prefer-inline') - $SnsOAuthInfoCopyWith<$Res> get snsOAuthInfo { - return $SnsOAuthInfoCopyWith<$Res>(_value.snsOAuthInfo, (value) { - return _then(_value.copyWith(snsOAuthInfo: value)); - }); - } -} - -/// @nodoc - -class _$UserDataEntityNewUser extends UserDataEntityNewUser { - const _$UserDataEntityNewUser( - {required this.snsOAuthInfo, this.userProfile = const ProfileForm()}) - : super._(); - - @override - final SnsOAuthInfo snsOAuthInfo; - @override - @JsonKey() - final ProfileForm userProfile; - - @override - String toString() { - return 'UserDataEntity.newUser(snsOAuthInfo: $snsOAuthInfo, userProfile: $userProfile)'; - } - - @override - bool operator ==(dynamic other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$UserDataEntityNewUser && - (identical(other.snsOAuthInfo, snsOAuthInfo) || - other.snsOAuthInfo == snsOAuthInfo) && - (identical(other.userProfile, userProfile) || - other.userProfile == userProfile)); - } - - @override - int get hashCode => Object.hash(runtimeType, snsOAuthInfo, userProfile); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$UserDataEntityNewUserCopyWith<_$UserDataEntityNewUser> get copyWith => - __$$UserDataEntityNewUserCopyWithImpl<_$UserDataEntityNewUser>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - SnsOAuthInfo snsOAuthInfo, ProfileForm userProfile) - newUser, - required TResult Function( - @JsonKey(name: 'fbUid') String firebaseUid, ProfileForm userProfile) - existUser, - }) { - return newUser(snsOAuthInfo, userProfile); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(SnsOAuthInfo snsOAuthInfo, ProfileForm userProfile)? - newUser, - TResult? Function(@JsonKey(name: 'fbUid') String firebaseUid, - ProfileForm userProfile)? - existUser, - }) { - return newUser?.call(snsOAuthInfo, userProfile); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(SnsOAuthInfo snsOAuthInfo, ProfileForm userProfile)? - newUser, - TResult Function(@JsonKey(name: 'fbUid') String firebaseUid, - ProfileForm userProfile)? - existUser, - required TResult orElse(), - }) { - if (newUser != null) { - return newUser(snsOAuthInfo, userProfile); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(UserDataEntityNewUser value) newUser, - required TResult Function(UserDataEntityExistUser value) existUser, - }) { - return newUser(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(UserDataEntityNewUser value)? newUser, - TResult? Function(UserDataEntityExistUser value)? existUser, - }) { - return newUser?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(UserDataEntityNewUser value)? newUser, - TResult Function(UserDataEntityExistUser value)? existUser, - required TResult orElse(), - }) { - if (newUser != null) { - return newUser(this); - } - return orElse(); - } -} - -abstract class UserDataEntityNewUser extends UserDataEntity { - const factory UserDataEntityNewUser( - {required final SnsOAuthInfo snsOAuthInfo, - final ProfileForm userProfile}) = _$UserDataEntityNewUser; - const UserDataEntityNewUser._() : super._(); - - SnsOAuthInfo get snsOAuthInfo; - @override - ProfileForm get userProfile; - @override - @JsonKey(ignore: true) - _$$UserDataEntityNewUserCopyWith<_$UserDataEntityNewUser> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$UserDataEntityExistUserCopyWith<$Res> - implements $UserDataEntityCopyWith<$Res> { - factory _$$UserDataEntityExistUserCopyWith(_$UserDataEntityExistUser value, - $Res Function(_$UserDataEntityExistUser) then) = - __$$UserDataEntityExistUserCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {@JsonKey(name: 'fbUid') String firebaseUid, ProfileForm userProfile}); - - @override - $ProfileFormCopyWith<$Res> get userProfile; -} - -/// @nodoc -class __$$UserDataEntityExistUserCopyWithImpl<$Res> - extends _$UserDataEntityCopyWithImpl<$Res, _$UserDataEntityExistUser> - implements _$$UserDataEntityExistUserCopyWith<$Res> { - __$$UserDataEntityExistUserCopyWithImpl(_$UserDataEntityExistUser _value, - $Res Function(_$UserDataEntityExistUser) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? firebaseUid = null, - Object? userProfile = null, - }) { - return _then(_$UserDataEntityExistUser( - firebaseUid: null == firebaseUid - ? _value.firebaseUid - : firebaseUid // ignore: cast_nullable_to_non_nullable - as String, - userProfile: null == userProfile - ? _value.userProfile - : userProfile // ignore: cast_nullable_to_non_nullable - as ProfileForm, - )); - } -} - -/// @nodoc - -class _$UserDataEntityExistUser extends UserDataEntityExistUser { - const _$UserDataEntityExistUser( - {@JsonKey(name: 'fbUid') required this.firebaseUid, - this.userProfile = const ProfileForm()}) - : super._(); - - @override - @JsonKey(name: 'fbUid') - final String firebaseUid; - @override - @JsonKey() - final ProfileForm userProfile; - - @override - String toString() { - return 'UserDataEntity.existUser(firebaseUid: $firebaseUid, userProfile: $userProfile)'; - } - - @override - bool operator ==(dynamic other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$UserDataEntityExistUser && - (identical(other.firebaseUid, firebaseUid) || - other.firebaseUid == firebaseUid) && - (identical(other.userProfile, userProfile) || - other.userProfile == userProfile)); - } - - @override - int get hashCode => Object.hash(runtimeType, firebaseUid, userProfile); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$UserDataEntityExistUserCopyWith<_$UserDataEntityExistUser> get copyWith => - __$$UserDataEntityExistUserCopyWithImpl<_$UserDataEntityExistUser>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - SnsOAuthInfo snsOAuthInfo, ProfileForm userProfile) - newUser, - required TResult Function( - @JsonKey(name: 'fbUid') String firebaseUid, ProfileForm userProfile) - existUser, - }) { - return existUser(firebaseUid, userProfile); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(SnsOAuthInfo snsOAuthInfo, ProfileForm userProfile)? - newUser, - TResult? Function(@JsonKey(name: 'fbUid') String firebaseUid, - ProfileForm userProfile)? - existUser, - }) { - return existUser?.call(firebaseUid, userProfile); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(SnsOAuthInfo snsOAuthInfo, ProfileForm userProfile)? - newUser, - TResult Function(@JsonKey(name: 'fbUid') String firebaseUid, - ProfileForm userProfile)? - existUser, - required TResult orElse(), - }) { - if (existUser != null) { - return existUser(firebaseUid, userProfile); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(UserDataEntityNewUser value) newUser, - required TResult Function(UserDataEntityExistUser value) existUser, - }) { - return existUser(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(UserDataEntityNewUser value)? newUser, - TResult? Function(UserDataEntityExistUser value)? existUser, - }) { - return existUser?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(UserDataEntityNewUser value)? newUser, - TResult Function(UserDataEntityExistUser value)? existUser, - required TResult orElse(), - }) { - if (existUser != null) { - return existUser(this); - } - return orElse(); - } -} - -abstract class UserDataEntityExistUser extends UserDataEntity { - const factory UserDataEntityExistUser( - {@JsonKey(name: 'fbUid') required final String firebaseUid, - final ProfileForm userProfile}) = _$UserDataEntityExistUser; - const UserDataEntityExistUser._() : super._(); - - @JsonKey(name: 'fbUid') - String get firebaseUid; - @override - ProfileForm get userProfile; - @override - @JsonKey(ignore: true) - _$$UserDataEntityExistUserCopyWith<_$UserDataEntityExistUser> get copyWith => - throw _privateConstructorUsedError; -} diff --git a/lib/features/user/domain/user_info_dto.dart b/lib/features/user/domain/user_info_dto.dart deleted file mode 100644 index ba2e5b9..0000000 --- a/lib/features/user/domain/user_info_dto.dart +++ /dev/null @@ -1,44 +0,0 @@ -// library forecast; - -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:pets_next_door_flutter/core/constants/enums.dart'; -import 'package:pets_next_door_flutter/features/pet/domain/pet.dart'; -import 'package:pets_next_door_flutter/features/sign_up/domain/profile_form.dart'; -import 'package:pets_next_door_flutter/features/user/domain/user_data_model.dart'; -import 'package:pets_next_door_flutter/presentation/pages/user/layout/text_form_state.dart'; - -part 'user_info_dto.freezed.dart'; -part 'user_info_dto.g.dart'; - -/// 회원가입을 위해 DB에 등록하는데 필요한 데이터 목록 -/// - [email] : 유저의 이메일 -/// - [providerType] : 회원가입에 사용한 sns provider 타입 -/// - [firebaseUid] : firebase로그인 후 발급받은 firebas uid -/// - [fullname] : 유저의 실제 이름 -/// - [nickname] : 유저가 설정한 닉네임 -@freezed -class UserInfoDto with _$UserInfoDto { - factory UserInfoDto({ - required String email, - @JsonKey(name: 'fbProviderType') required SnsProviderType providerType, - @JsonKey(name: 'fbUid') required String firebaseUid, - String? fullname, - String? nickname, - int? profileImageId, - List? pets, - }) = _UserInfoDto; - - const UserInfoDto._(); - - factory UserInfoDto.fromJson(Map json) => - _$UserInfoDtoFromJson(json); - - UserDataEntity toExistingUserModel() => UserDataEntity.existUser( - firebaseUid: firebaseUid, - userProfile: ProfileForm( - nickname: TextFormState.valid(nickname ?? ''), - pets: pets ?? [], - profileImageId: profileImageId, - ), - ); -} diff --git a/lib/features/user/domain/user_info_dto.freezed.dart b/lib/features/user/domain/user_info_dto.freezed.dart deleted file mode 100644 index a2fa8ca..0000000 --- a/lib/features/user/domain/user_info_dto.freezed.dart +++ /dev/null @@ -1,305 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'user_info_dto.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); - -UserInfoDto _$UserInfoDtoFromJson(Map json) { - return _UserInfoDto.fromJson(json); -} - -/// @nodoc -mixin _$UserInfoDto { - String get email => throw _privateConstructorUsedError; - @JsonKey(name: 'fbProviderType') - SnsProviderType get providerType => throw _privateConstructorUsedError; - @JsonKey(name: 'fbUid') - String get firebaseUid => throw _privateConstructorUsedError; - String? get fullname => throw _privateConstructorUsedError; - String? get nickname => throw _privateConstructorUsedError; - int? get profileImageId => throw _privateConstructorUsedError; - List? get pets => throw _privateConstructorUsedError; - - Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) - $UserInfoDtoCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $UserInfoDtoCopyWith<$Res> { - factory $UserInfoDtoCopyWith( - UserInfoDto value, $Res Function(UserInfoDto) then) = - _$UserInfoDtoCopyWithImpl<$Res, UserInfoDto>; - @useResult - $Res call( - {String email, - @JsonKey(name: 'fbProviderType') SnsProviderType providerType, - @JsonKey(name: 'fbUid') String firebaseUid, - String? fullname, - String? nickname, - int? profileImageId, - List? pets}); -} - -/// @nodoc -class _$UserInfoDtoCopyWithImpl<$Res, $Val extends UserInfoDto> - implements $UserInfoDtoCopyWith<$Res> { - _$UserInfoDtoCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? email = null, - Object? providerType = null, - Object? firebaseUid = null, - Object? fullname = freezed, - Object? nickname = freezed, - Object? profileImageId = freezed, - Object? pets = freezed, - }) { - return _then(_value.copyWith( - email: null == email - ? _value.email - : email // ignore: cast_nullable_to_non_nullable - as String, - providerType: null == providerType - ? _value.providerType - : providerType // ignore: cast_nullable_to_non_nullable - as SnsProviderType, - firebaseUid: null == firebaseUid - ? _value.firebaseUid - : firebaseUid // ignore: cast_nullable_to_non_nullable - as String, - fullname: freezed == fullname - ? _value.fullname - : fullname // ignore: cast_nullable_to_non_nullable - as String?, - nickname: freezed == nickname - ? _value.nickname - : nickname // ignore: cast_nullable_to_non_nullable - as String?, - profileImageId: freezed == profileImageId - ? _value.profileImageId - : profileImageId // ignore: cast_nullable_to_non_nullable - as int?, - pets: freezed == pets - ? _value.pets - : pets // ignore: cast_nullable_to_non_nullable - as List?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$_UserInfoDtoCopyWith<$Res> - implements $UserInfoDtoCopyWith<$Res> { - factory _$$_UserInfoDtoCopyWith( - _$_UserInfoDto value, $Res Function(_$_UserInfoDto) then) = - __$$_UserInfoDtoCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String email, - @JsonKey(name: 'fbProviderType') SnsProviderType providerType, - @JsonKey(name: 'fbUid') String firebaseUid, - String? fullname, - String? nickname, - int? profileImageId, - List? pets}); -} - -/// @nodoc -class __$$_UserInfoDtoCopyWithImpl<$Res> - extends _$UserInfoDtoCopyWithImpl<$Res, _$_UserInfoDto> - implements _$$_UserInfoDtoCopyWith<$Res> { - __$$_UserInfoDtoCopyWithImpl( - _$_UserInfoDto _value, $Res Function(_$_UserInfoDto) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? email = null, - Object? providerType = null, - Object? firebaseUid = null, - Object? fullname = freezed, - Object? nickname = freezed, - Object? profileImageId = freezed, - Object? pets = freezed, - }) { - return _then(_$_UserInfoDto( - email: null == email - ? _value.email - : email // ignore: cast_nullable_to_non_nullable - as String, - providerType: null == providerType - ? _value.providerType - : providerType // ignore: cast_nullable_to_non_nullable - as SnsProviderType, - firebaseUid: null == firebaseUid - ? _value.firebaseUid - : firebaseUid // ignore: cast_nullable_to_non_nullable - as String, - fullname: freezed == fullname - ? _value.fullname - : fullname // ignore: cast_nullable_to_non_nullable - as String?, - nickname: freezed == nickname - ? _value.nickname - : nickname // ignore: cast_nullable_to_non_nullable - as String?, - profileImageId: freezed == profileImageId - ? _value.profileImageId - : profileImageId // ignore: cast_nullable_to_non_nullable - as int?, - pets: freezed == pets - ? _value._pets - : pets // ignore: cast_nullable_to_non_nullable - as List?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$_UserInfoDto extends _UserInfoDto { - _$_UserInfoDto( - {required this.email, - @JsonKey(name: 'fbProviderType') required this.providerType, - @JsonKey(name: 'fbUid') required this.firebaseUid, - this.fullname, - this.nickname, - this.profileImageId, - final List? pets}) - : _pets = pets, - super._(); - - factory _$_UserInfoDto.fromJson(Map json) => - _$$_UserInfoDtoFromJson(json); - - @override - final String email; - @override - @JsonKey(name: 'fbProviderType') - final SnsProviderType providerType; - @override - @JsonKey(name: 'fbUid') - final String firebaseUid; - @override - final String? fullname; - @override - final String? nickname; - @override - final int? profileImageId; - final List? _pets; - @override - List? get pets { - final value = _pets; - if (value == null) return null; - if (_pets is EqualUnmodifiableListView) return _pets; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); - } - - @override - String toString() { - return 'UserInfoDto(email: $email, providerType: $providerType, firebaseUid: $firebaseUid, fullname: $fullname, nickname: $nickname, profileImageId: $profileImageId, pets: $pets)'; - } - - @override - bool operator ==(dynamic other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$_UserInfoDto && - (identical(other.email, email) || other.email == email) && - (identical(other.providerType, providerType) || - other.providerType == providerType) && - (identical(other.firebaseUid, firebaseUid) || - other.firebaseUid == firebaseUid) && - (identical(other.fullname, fullname) || - other.fullname == fullname) && - (identical(other.nickname, nickname) || - other.nickname == nickname) && - (identical(other.profileImageId, profileImageId) || - other.profileImageId == profileImageId) && - const DeepCollectionEquality().equals(other._pets, _pets)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash( - runtimeType, - email, - providerType, - firebaseUid, - fullname, - nickname, - profileImageId, - const DeepCollectionEquality().hash(_pets)); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$_UserInfoDtoCopyWith<_$_UserInfoDto> get copyWith => - __$$_UserInfoDtoCopyWithImpl<_$_UserInfoDto>(this, _$identity); - - @override - Map toJson() { - return _$$_UserInfoDtoToJson( - this, - ); - } -} - -abstract class _UserInfoDto extends UserInfoDto { - factory _UserInfoDto( - {required final String email, - @JsonKey(name: 'fbProviderType') - required final SnsProviderType providerType, - @JsonKey(name: 'fbUid') required final String firebaseUid, - final String? fullname, - final String? nickname, - final int? profileImageId, - final List? pets}) = _$_UserInfoDto; - _UserInfoDto._() : super._(); - - factory _UserInfoDto.fromJson(Map json) = - _$_UserInfoDto.fromJson; - - @override - String get email; - @override - @JsonKey(name: 'fbProviderType') - SnsProviderType get providerType; - @override - @JsonKey(name: 'fbUid') - String get firebaseUid; - @override - String? get fullname; - @override - String? get nickname; - @override - int? get profileImageId; - @override - List? get pets; - @override - @JsonKey(ignore: true) - _$$_UserInfoDtoCopyWith<_$_UserInfoDto> get copyWith => - throw _privateConstructorUsedError; -} diff --git a/lib/features/user/domain/user_info_dto.g.dart b/lib/features/user/domain/user_info_dto.g.dart deleted file mode 100644 index 03d1172..0000000 --- a/lib/features/user/domain/user_info_dto.g.dart +++ /dev/null @@ -1,38 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_info_dto.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$_UserInfoDto _$$_UserInfoDtoFromJson(Map json) => - _$_UserInfoDto( - email: json['email'] as String, - providerType: - $enumDecode(_$SnsProviderTypeEnumMap, json['fbProviderType']), - firebaseUid: json['fbUid'] as String, - fullname: json['fullname'] as String?, - nickname: json['nickname'] as String?, - profileImageId: json['profileImageId'] as int?, - pets: (json['pets'] as List?) - ?.map((e) => Pet.fromJson(e as Map)) - .toList(), - ); - -Map _$$_UserInfoDtoToJson(_$_UserInfoDto instance) => - { - 'email': instance.email, - 'fbProviderType': _$SnsProviderTypeEnumMap[instance.providerType]!, - 'fbUid': instance.firebaseUid, - 'fullname': instance.fullname, - 'nickname': instance.nickname, - 'profileImageId': instance.profileImageId, - 'pets': instance.pets, - }; - -const _$SnsProviderTypeEnumMap = { - SnsProviderType.kakao: 'kakao', - SnsProviderType.google: 'google', - SnsProviderType.apple: 'apple', -}; diff --git a/lib/features/user/entities/user_data_entity.dart b/lib/features/user/entities/user_data_entity.dart new file mode 100644 index 0000000..8601c0b --- /dev/null +++ b/lib/features/user/entities/user_data_entity.dart @@ -0,0 +1,64 @@ +import 'package:flutter/foundation.dart'; +import 'package:pets_next_door_flutter/features/user/data/models/user_data_model.dart'; + +/// 앱단에서 사용하는 유저 데이터 모델 +@immutable +class UserDataEntity { + const UserDataEntity({ + required this.uid, + required this.firebaseUid, + required this.email, + required this.nickname, + List? petIdList, + }) : petIdList = petIdList ?? const []; + + final String uid; + final String firebaseUid; + final String email; + final String nickname; + final List petIdList; + + @override + bool operator ==(Object other) => + identical(this, other) || + (other is UserDataEntity && + runtimeType == other.runtimeType && + uid == other.uid && + nickname == other.nickname && + petIdList == other.petIdList); + + @override + int get hashCode => uid.hashCode ^ nickname.hashCode ^ petIdList.hashCode; + + UserDataEntity copyWith({ + String? uid, + String? firebaseUid, + String? email, + String? nickname, + List? petIdList, + }) { + return UserDataEntity( + uid: uid ?? this.uid, + firebaseUid: firebaseUid ?? this.firebaseUid, + email: email ?? this.email, + nickname: nickname ?? this.nickname, + petIdList: petIdList ?? this.petIdList, + ); + } + + UserDataModel toModel() => UserDataModel( + id: uid, + email: '', + firebaseProviderType: '', + firebaseUid: firebaseUid, + fullname: '', + nickname: ''); + factory UserDataEntity.fromModel(UserDataModel model) => UserDataEntity( + uid: model.id, + firebaseUid: model.firebaseUid, + email: model.email, + nickname: model.nickname, + // TODO: 아직 서버에서 pet 리스트 부분 추가되지 않았음 + petIdList: [], + ); +} diff --git a/lib/features/user/repositories/user_repository.dart b/lib/features/user/repositories/user_repository.dart new file mode 100644 index 0000000..367ffc5 --- /dev/null +++ b/lib/features/user/repositories/user_repository.dart @@ -0,0 +1,7 @@ +import 'package:pets_next_door_flutter/features/user/entities/user_data_entity.dart'; + +abstract interface class UserRepository { + // TODO: 회원가입 기능에서 구현할 예정 + Future createUserData(UserDataEntity data); + Future getUserData(); +} diff --git a/lib/features/user/repositories/user_repository_impl.dart b/lib/features/user/repositories/user_repository_impl.dart new file mode 100644 index 0000000..113ce97 --- /dev/null +++ b/lib/features/user/repositories/user_repository_impl.dart @@ -0,0 +1,31 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:pets_next_door_flutter/features/user/data/remote/user_remote_data_source.dart'; +import 'package:pets_next_door_flutter/features/user/entities/user_data_entity.dart'; +import 'package:pets_next_door_flutter/features/user/repositories/user_repository.dart'; + +final class UserRepositoryImpl implements UserRepository { + const UserRepositoryImpl( + this._userRemoteDataSource, + ); + + final UserRemoteDataSource _userRemoteDataSource; + + @override + Future createUserData(UserDataEntity data) async { + // TODO: 추후 회원가입 로직에서 구현예정 + } + + @override + Future getUserData() async { + final uid = FirebaseAuth.instance.currentUser!.uid; + + var userData = await _userRemoteDataSource.getUserData(uid); + + if (userData == null) { + return null; + } + + // remote data source에서 받아온 모델을 앱에서 사용하는 모델로 변환 + return UserDataEntity.fromModel(userData); + } +} diff --git a/lib/features/user/usecases/get_user_data_use_case.dart b/lib/features/user/usecases/get_user_data_use_case.dart new file mode 100644 index 0000000..fe249a6 --- /dev/null +++ b/lib/features/user/usecases/get_user_data_use_case.dart @@ -0,0 +1,14 @@ +import 'package:pets_next_door_flutter/features/user/entities/user_data_entity.dart'; +import 'package:pets_next_door_flutter/features/user/repositories/user_repository.dart'; + +final class GetUserDataUseCase { + const GetUserDataUseCase( + this._userRepository, + ); + + final UserRepository _userRepository; + + Future call() async { + return _userRepository.getUserData(); + } +} diff --git a/lib/features/user/user.dart b/lib/features/user/user.dart new file mode 100644 index 0000000..1b8708d --- /dev/null +++ b/lib/features/user/user.dart @@ -0,0 +1,12 @@ +import 'package:pets_next_door_flutter/app/di/locator.dart'; +import 'package:pets_next_door_flutter/features/user/data/remote/user_remote_data_source.dart'; +import 'package:pets_next_door_flutter/features/user/repositories/user_repository.dart'; +import 'package:pets_next_door_flutter/features/user/usecases/get_user_data_use_case.dart'; + +export 'data/remote/user_remote_data_source.dart'; +export 'repositories/user_repository.dart'; +export 'usecases/get_user_data_use_case.dart'; + +final userRemoteDataSource = locator(); +final userRepository = locator(); +final getUserDataUseCase = locator(); diff --git a/lib/presentation/providers/user/user_auth_provider.dart b/lib/presentation/providers/user/user_auth_provider.dart new file mode 100644 index 0000000..dd9d8b0 --- /dev/null +++ b/lib/presentation/providers/user/user_auth_provider.dart @@ -0,0 +1,19 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'user_auth_provider.g.dart'; + +/// 앱 사용자 권한 프로바이더 +// TODO: 추후에 인증, 로그인, 로그아웃 기능 추가할 예정 +@Riverpod(keepAlive: true) +class UserAuth extends _$UserAuth { + @override + User? build() { + return FirebaseAuth.instance.currentUser; + } +} + +/// 현재 앱 사용자가 인증되었는지 여부 +@riverpod +bool isUserAuthorized(IsUserAuthorizedRef ref) => + ref.watch(userAuthProvider) != null; diff --git a/lib/presentation/providers/user/user_auth_provider.g.dart b/lib/presentation/providers/user/user_auth_provider.g.dart new file mode 100644 index 0000000..b0191f0 --- /dev/null +++ b/lib/presentation/providers/user/user_auth_provider.g.dart @@ -0,0 +1,43 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_auth_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$isUserAuthorizedHash() => r'6eb8b9bb525aec1c6d8222111275017d13ead82c'; + +/// 현재 앱 사용자가 인증되었는지 여부 +/// +/// Copied from [isUserAuthorized]. +@ProviderFor(isUserAuthorized) +final isUserAuthorizedProvider = AutoDisposeProvider.internal( + isUserAuthorized, + name: r'isUserAuthorizedProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$isUserAuthorizedHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef IsUserAuthorizedRef = AutoDisposeProviderRef; +String _$userAuthHash() => r'0741e0ef24a25c3bf3473350fa99061268c61ebb'; + +/// 앱 사용자 권한 프로바이더 +/// +/// Copied from [UserAuth]. +@ProviderFor(UserAuth) +final userAuthProvider = NotifierProvider.internal( + UserAuth.new, + name: r'userAuthProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') ? null : _$userAuthHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$UserAuth = Notifier; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member diff --git a/lib/presentation/providers/user/user_data_provider.dart b/lib/presentation/providers/user/user_data_provider.dart new file mode 100644 index 0000000..4dfa555 --- /dev/null +++ b/lib/presentation/providers/user/user_data_provider.dart @@ -0,0 +1,22 @@ +import 'package:pets_next_door_flutter/features/user/entities/user_data_entity.dart'; +import 'package:pets_next_door_flutter/features/user/user.dart'; +import 'package:pets_next_door_flutter/presentation/providers/user/user_auth_provider.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'user_data_provider.g.dart'; + +@Riverpod(keepAlive: true) +class UserData extends _$UserData { + @override + FutureOr build() async { + final userAuth = ref.watch(userAuthProvider); + + if (userAuth == null) throw Exception('로그인 필요'); + + final userData = await getUserDataUseCase.call(); + + return userData; + } + + void updateUserData() {} +} diff --git a/lib/presentation/providers/user/user_data_provider.g.dart b/lib/presentation/providers/user/user_data_provider.g.dart new file mode 100644 index 0000000..ac04a90 --- /dev/null +++ b/lib/presentation/providers/user/user_data_provider.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_data_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$userDataHash() => r'9e00e111b5a3aae812ceb2df6e53518b30b83ca2'; + +/// See also [UserData]. +@ProviderFor(UserData) +final userDataProvider = + AsyncNotifierProvider.internal( + UserData.new, + name: r'userDataProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') ? null : _$userDataHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$UserData = AsyncNotifier; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member