Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Refactor code #52

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/data/mapper/cast_mapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ class CastMapper extends BaseMapper<CastData, Cast> {
gender: data.gender,
knownForDepartment: data.knownForDepartment,
originalName: data.originalName,
profilePath: data.profilePath == null ? null : "$baseImageUrl${data.profilePath}");
profilePath: data.profilePath == null
? null
: "$baseImageUrl${data.profilePath}");
}
}
3 changes: 2 additions & 1 deletion lib/data/mapper/casts_maper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class CastsMapper extends BaseMapper<CastsData, Casts> {

@override
Casts map(CastsData data) {
return Casts(id: data.id, cast: castMapper.mapList(data.casts ?? List.empty()));
return Casts(
id: data.id, cast: castMapper.mapList(data.casts ?? List.empty()));
}
}
7 changes: 5 additions & 2 deletions lib/data/mapper/movie_mapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@ class MovieMapper extends BaseMapper<MovieData, Movie> {
Movie map(MovieData data) {
return Movie(
id: data.id,
posterPath: data.posterPath == null ? null : "$baseImageUrl${data.posterPath}",
backdropPath: data.backdropPath == null ? null : "$baseImageUrl${data.backdropPath}",
posterPath:
data.posterPath == null ? null : "$baseImageUrl${data.posterPath}",
backdropPath: data.backdropPath == null
? null
: "$baseImageUrl${data.backdropPath}",
originalTitle: data.originalTitle,
title: data.title,
overview: data.overview,
Expand Down
17 changes: 17 additions & 0 deletions lib/data/mapper/user_mapper.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:flutter_movie_clean/data/mapper/base_mapper.dart';
import 'package:flutter_movie_clean/data/model/user_data.dart';
import 'package:flutter_movie_clean/domain/model/user.dart';

final class UserMapper extends BaseMapper<UserData, User> {
UserMapper();

@override
User map(UserData data) {
return User(
email: data.email,
password: data.password,
nickname: data.nickname,
pin: data.pin,
);
}
}
4 changes: 3 additions & 1 deletion lib/data/model/cast_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_movie_clean/data/model/base_data.dart';

part 'cast_data.freezed.dart';
part 'cast_data.g.dart';

@freezed
class CastData extends BaseData with _$CastData {
Expand All @@ -16,5 +17,6 @@ class CastData extends BaseData with _$CastData {
@JsonKey(name: "character") String? character,
}) = _CastData;

factory CastData.fromJson(Map<String, Object?> json) => _$CastDataFromJson(json);
factory CastData.fromJson(Map<String, Object?> json) =>
_$CastDataFromJson(json);
}
4 changes: 3 additions & 1 deletion lib/data/model/casts_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
import 'cast_data.dart';

part 'casts_data.freezed.dart';
part 'casts_data.g.dart';

@freezed
class CastsData extends BaseData with _$CastsData {
Expand All @@ -11,5 +12,6 @@ class CastsData extends BaseData with _$CastsData {
@JsonKey(name: "cast") List<CastData>? casts,
}) = _CastsData;

factory CastsData.fromJson(Map<String, Object?> json) => _$CastsDataFromJson(json);
factory CastsData.fromJson(Map<String, Object?> json) =>
_$CastsDataFromJson(json);
}
4 changes: 3 additions & 1 deletion lib/data/model/movie_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter_movie_clean/data/model/base_data.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'movie_data.freezed.dart';
part 'movie_data.g.dart';

@freezed
class MovieData extends BaseData with _$MovieData {
Expand All @@ -20,5 +21,6 @@ class MovieData extends BaseData with _$MovieData {
@JsonKey(name: "adult") bool? isAdult,
}) = _MovieData;

factory MovieData.fromJson(Map<String, Object?> json) => _$MovieDataFromJson(json);
factory MovieData.fromJson(Map<String, Object?> json) =>
_$MovieDataFromJson(json);
}
4 changes: 3 additions & 1 deletion lib/data/model/tv_series_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter_movie_clean/data/model/base_data.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'tv_series_data.freezed.dart';
part 'tv_series_data.g.dart';

@freezed
class TvSeriesData extends BaseData with _$TvSeriesData {
Expand All @@ -21,5 +22,6 @@ class TvSeriesData extends BaseData with _$TvSeriesData {
@JsonKey(name: "popularity") double? popularity,
}) = _TvSeriesData;

factory TvSeriesData.fromJson(Map<String, Object?> json) => _$TvSeriesDataFromJson(json);
factory TvSeriesData.fromJson(Map<String, Object?> json) =>
_$TvSeriesDataFromJson(json);
}
19 changes: 19 additions & 0 deletions lib/data/model/user_data.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_movie_clean/data/model/base_data.dart';

part 'user_data.freezed.dart';
part 'user_data.g.dart';

@freezed
class UserData extends BaseData with _$UserData {
const factory UserData({
@JsonKey(name: "email") String? email,
@JsonKey(name: "password") String? password,
@JsonKey(name: "avatar") String? avatar,
@JsonKey(name: "nickname") String? nickname,
@JsonKey(name: "pin") String? pin,
}) = _UserData;

factory UserData.fromJson(Map<String, Object?> json) =>
_$UserDataFromJson(json);
}
3 changes: 2 additions & 1 deletion lib/data/repository/movie_repository_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ class MovieRepositoryImpl extends MovieRepository {

@override
Future<List<Movie>> getSimilarMovies(int movieId, String language) async {
final movies = await movieRemoteDataSource.getSimilarMovies(movieId, language);
final movies =
await movieRemoteDataSource.getSimilarMovies(movieId, language);
return movieMapper.mapList(movies);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@ class SharedPrefKey {
SharedPrefKey._();

static const String accessToken = "accessToken";
static const String prefKeyUser = "prefKeyUser";
static const String prefHasCompletedBoarding = "prefHasCompletedBoarding";
}
38 changes: 38 additions & 0 deletions lib/data/repository/source/local/user_local_data_source.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import 'dart:convert';

import 'package:flutter_movie_clean/data/model/user_data.dart';
import 'package:flutter_movie_clean/data/repository/source/local/preference/shared_pref_key.dart';
import 'package:shared_preferences/shared_preferences.dart';

class UserLocalDataSource {
final SharedPreferences sharedPreferences;

UserLocalDataSource(this.sharedPreferences);

Future<void> saveUser(UserData user) async {
sharedPreferences.setString(SharedPrefKey.prefKeyUser, jsonEncode(user));
}

Future<UserData?> getUser() async {
final userData = sharedPreferences.getString(SharedPrefKey.prefKeyUser);
if (userData != null) {
return UserData.fromJson(jsonDecode(userData) as Map<String, dynamic>);
} else {
return null;
}
}

Future<void> removeUser() {
return sharedPreferences.remove(SharedPrefKey.prefKeyUser);
}

Future<void> completeBoarding() {
return sharedPreferences.setBool(
SharedPrefKey.prefHasCompletedBoarding, true);
}

Future<bool> hasCompletedBoarding() async {
return sharedPreferences.getBool(SharedPrefKey.prefHasCompletedBoarding) ==
true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ class MovieRemoteDataSource {
}

Future<MovieData> getMovieDetail(int movieId, String language) async {
return await authApi.execute((api) => api.getMovieDetail(movieId, language));
return await authApi
.execute((api) => api.getMovieDetail(movieId, language));
}

Future<CastsData> getCasts(int movieId, String language) async {
Expand Down
44 changes: 44 additions & 0 deletions lib/data/repository/source/remote/user_remote_data_source.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// ignore_for_file: unused_field

import 'package:flutter_movie_clean/data/model/user_data.dart';
import 'package:flutter_movie_clean/data/repository/source/remote/api/auth_api.dart';
import 'package:flutter_movie_clean/data/repository/source/remote/api/un_auth_api.dart';

class UserRemoteDataSource {
final UnAuthApi _unAuthApi;
final AuthApi _authApi;

UserRemoteDataSource(this._unAuthApi, this._authApi);

Future<UserData> signUp({
required String email,
required String password,
required String avatar,
required String nickname,
required String pin,
}) async {
final fakeUserData = UserData.fromJson(
Map<String, String>.of(<String, String>{
"email": email,
"password": password,
"avatar": avatar,
"nickname": nickname,
"pin": pin,
}),
);
return fakeUserData;
}

Future<UserData> signIn(String email, String password) async {
final fakeUserData = UserData.fromJson(
Map<String, String>.of(
<String, String>{"email": email, "password": password}),
);
return fakeUserData;
}

Future<void> signOut() async {
// fake always success
return Future.value();
}
}
65 changes: 65 additions & 0 deletions lib/data/repository/user_repository_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import 'package:flutter_movie_clean/data/mapper/user_mapper.dart';
import 'package:flutter_movie_clean/data/repository/source/local/user_local_data_source.dart';
import 'package:flutter_movie_clean/data/repository/source/remote/user_remote_data_source.dart';
import 'package:flutter_movie_clean/domain/model/user.dart';
import 'package:flutter_movie_clean/domain/repository/user_repository.dart';

class UserRepositoryImpl extends UserRepository {
UserRepositoryImpl(
this._userLocalDataSource, this._userRemoteDataSource, this._userMapper);
final UserLocalDataSource _userLocalDataSource;
final UserRemoteDataSource _userRemoteDataSource;
final UserMapper _userMapper;

@override
Future<void> completeBoarding() async {
return await _userLocalDataSource.completeBoarding();
}

@override
Future<bool> hasCompletedBoarding() async {
return await _userLocalDataSource.hasCompletedBoarding();
}

@override
Future<User?> signIn(String email, String password) async {
final userData = await _userRemoteDataSource.signIn(email, password);
await _userLocalDataSource.saveUser(userData);
return _userMapper.map(userData);
}

@override
Future<User?> signUp({
required String email,
required String password,
required String avatar,
required String nickname,
required String pin,
}) async {
final userData = await _userRemoteDataSource.signUp(
email: email,
password: password,
avatar: avatar,
nickname: nickname,
pin: pin,
);
await _userLocalDataSource.saveUser(userData);
return _userMapper.map(userData);
}

@override
Future<void> signOut() async {
await _userRemoteDataSource.signOut();
await _userLocalDataSource.removeUser();
}

@override
Future<User?> getLocalUser() async {
final userData = await _userLocalDataSource.getUser();
if (userData != null) {
return _userMapper.map(userData);
} else {
return null;
}
}
}
5 changes: 5 additions & 0 deletions lib/di/mapper_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter_movie_clean/data/mapper/cast_mapper.dart';
import 'package:flutter_movie_clean/data/mapper/casts_maper.dart';
import 'package:flutter_movie_clean/data/mapper/movie_mapper.dart';
import 'package:flutter_movie_clean/data/mapper/tv_series_mapper.dart';
import 'package:flutter_movie_clean/data/mapper/user_mapper.dart';
import 'package:flutter_movie_clean/di/app_provider.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

Expand All @@ -23,3 +24,7 @@ final castMapperProvider = Provider<CastMapper>((ref) {
final envConfigs = ref.watch(envConfigsProvider);
return CastMapper(envConfigs.baseImageUrl);
});

final userMapper = Provider<UserMapper>((ref) {
return UserMapper();
});
2 changes: 1 addition & 1 deletion lib/di/network_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ final authDioProvider = Provider<Dio>((ref) {
options: BaseOptions(baseUrl: envConfigs.baseUrl),
interceptors: [
ref.watch(authInterceptorProvider),
ref.watch(logInterceptorProvider),
// ref.watch(logInterceptorProvider),
],
);
});
Expand Down
21 changes: 21 additions & 0 deletions lib/di/repository_provider.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
import 'package:flutter_movie_clean/data/repository/movie_repository_impl.dart';
import 'package:flutter_movie_clean/data/repository/source/local/user_local_data_source.dart';
import 'package:flutter_movie_clean/data/repository/source/remote/movie_remote_data_source.dart';
import 'package:flutter_movie_clean/data/repository/source/remote/user_remote_data_source.dart';
import 'package:flutter_movie_clean/data/repository/user_repository_impl.dart';
import 'package:flutter_movie_clean/di/app_provider.dart';
import 'package:flutter_movie_clean/domain/repository/movie_repository.dart';
import 'package:flutter_movie_clean/di/mapper_provider.dart';
import 'package:flutter_movie_clean/di/network_provider.dart';
import 'package:flutter_movie_clean/domain/repository/user_repository.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

final movieRemoteDataSourceProvider = Provider<MovieRemoteDataSource>(
Expand All @@ -17,3 +22,19 @@ final movieRepositoryProvider = Provider<MovieRepository>((ref) {
ref.watch(castsMapperProvider),
);
});

final userLocalDataSourceProvider = Provider<UserLocalDataSource>(
(ref) => UserLocalDataSource(ref.watch(sharedPrefsProvider)),
);
final userRemoteDataSourceProvider = Provider<UserRemoteDataSource>(
(ref) => UserRemoteDataSource(
ref.watch(unAuthApiProvider), ref.watch(authApiProvider)),
);

final userRepositoryProvider = Provider<UserRepository>((ref) {
return UserRepositoryImpl(
ref.watch(userLocalDataSourceProvider),
ref.watch(userRemoteDataSourceProvider),
ref.watch(userMapper),
);
});
Loading