Skip to content

Commit 347b624

Browse files
committed
- Implemented recommended TV series and cast sections
- Added providers and use cases for recommended TV series and credits - Updated TV series detail page to display new sections
1 parent 4436474 commit 347b624

File tree

11 files changed

+347
-9
lines changed

11 files changed

+347
-9
lines changed

lib/features/tv_series/data/datasources/tv_series_remote_data_source.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import 'package:dio/dio.dart';
2+
import 'package:flutter_movie_clean_architecture/features/tv_series/data/models/tv_series_credit_model.dart';
23
import 'package:flutter_movie_clean_architecture/features/tv_series/data/models/tv_series_detail_model.dart';
34
import 'package:flutter_movie_clean_architecture/features/tv_series/data/models/tv_series_model.dart';
4-
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/entities/tv_series.dart';
5-
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/entities/tv_series_detail.dart';
65

76
class TvSeriesRemoteDataSource {
87
final Dio dio;
@@ -63,4 +62,16 @@ class TvSeriesRemoteDataSource {
6362
.map((e) => TvSeriesModel.fromJson(e as Map<String, dynamic>))
6463
.toList();
6564
}
65+
66+
Future<List<TvSeriesModel>> getRecommendedTvSeries(int tvSeriesId) async {
67+
final response = await dio.get('tv/$tvSeriesId/recommendations');
68+
return (response.data['results'] as List)
69+
.map((e) => TvSeriesModel.fromJson(e as Map<String, dynamic>))
70+
.toList();
71+
}
72+
73+
Future<TvSeriesCreditModel> getTvSeriesCredits(int tvSeriesId) async {
74+
final response = await dio.get('tv/$tvSeriesId/credits');
75+
return TvSeriesCreditModel.fromJson(response.data as Map<String, dynamic>);
76+
}
6677
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import 'package:freezed_annotation/freezed_annotation.dart';
2+
3+
part 'tv_series_credit_model.freezed.dart';
4+
part 'tv_series_credit_model.g.dart';
5+
6+
@freezed
7+
class TvSeriesCreditModel with _$TvSeriesCreditModel {
8+
const factory TvSeriesCreditModel({
9+
required int id,
10+
List<Cast>? cast,
11+
List<Crew>? crew,
12+
}) = _TvSeriesCreditModel;
13+
14+
factory TvSeriesCreditModel.fromJson(Map<String, dynamic> json) => _$TvSeriesCreditModelFromJson(json);
15+
}
16+
17+
@freezed
18+
class Cast with _$Cast {
19+
const factory Cast({
20+
required int id,
21+
bool? adult,
22+
int? gender,
23+
@JsonKey(name: 'known_for_department') String? knownForDepartment,
24+
String? name,
25+
@JsonKey(name: 'original_name') String? originalName,
26+
double? popularity,
27+
@JsonKey(name: 'profile_path') String? profilePath,
28+
@JsonKey(name: 'poster_path') String? posterPath,
29+
@JsonKey(name: 'cast_id') int? castId,
30+
String? character,
31+
@JsonKey(name: 'credit_id') String? creditId,
32+
int? order,
33+
}) = _Cast;
34+
35+
factory Cast.fromJson(Map<String, dynamic> json) => _$CastFromJson(json);
36+
}
37+
38+
@freezed
39+
class Crew with _$Crew {
40+
const factory Crew({
41+
required int id,
42+
bool? adult,
43+
int? gender,
44+
@JsonKey(name: 'known_for_department') String? knownForDepartment,
45+
String? name,
46+
@JsonKey(name: 'original_name') String? originalName,
47+
double? popularity,
48+
@JsonKey(name: 'profile_path') String? profilePath,
49+
@JsonKey(name: 'credit_id') String? creditId,
50+
String? department,
51+
String? job,
52+
}) = _Crew;
53+
54+
factory Crew.fromJson(Map<String, dynamic> json) => _$CrewFromJson(json);
55+
}

lib/features/tv_series/data/models/tv_series_detail_model.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:freezed_annotation/freezed_annotation.dart';
2-
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/entities/tv_series_detail.dart';
32

43
part 'tv_series_detail_model.freezed.dart';
54
part 'tv_series_detail_model.g.dart';
@@ -11,8 +10,8 @@ class TvSeriesDetailModel with _$TvSeriesDetailModel {
1110
required String name,
1211
@JsonKey(name: 'poster_path') String? posterPath,
1312
required String overview,
14-
@JsonKey(name: 'first_air_date') required String firstAirDate,
1513
@JsonKey(name: 'vote_average') required double voteAverage,
14+
@JsonKey(name: 'first_air_date') required String firstAirDate,
1615
@JsonKey(name: 'original_language') String? originalLanguage,
1716
@JsonKey(name: 'episode_run_time') List<int>? episodeRunTime,
1817
@JsonKey(name: 'last_air_date') String? lastAirDate,

lib/features/tv_series/data/models/tv_series_model.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:freezed_annotation/freezed_annotation.dart';
2-
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/entities/tv_series.dart';
32

43
part 'tv_series_model.freezed.dart';
54
part 'tv_series_model.g.dart';
@@ -13,5 +12,6 @@ class TvSeriesModel with _$TvSeriesModel {
1312
required String overview,
1413
}) = _TvSeriesModel;
1514

16-
factory TvSeriesModel.fromJson(Map<String, dynamic> json) => _$TvSeriesModelFromJson(json);
15+
factory TvSeriesModel.fromJson(Map<String, dynamic> json) =>
16+
_$TvSeriesModelFromJson(json);
1717
}

lib/features/tv_series/data/repositories/tv_series_repository_impl.dart

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'package:flutter_movie_clean_architecture/features/tv_series/data/datasources/tv_series_remote_data_source.dart';
2-
import 'package:flutter_movie_clean_architecture/features/tv_series/data/models/tv_series_detail_model.dart';
3-
import 'package:flutter_movie_clean_architecture/features/tv_series/data/models/tv_series_model.dart';
2+
import 'package:flutter_movie_clean_architecture/features/tv_series/data/models/tv_series_credit_model.dart';
43
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/entities/tv_series.dart';
54
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/entities/tv_series_detail.dart';
65
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/repositories/entities/tv_series_repository.dart';
76

7+
88
class TvSeriesRepositoryImpl implements TvSeriesRepository {
99
final TvSeriesRemoteDataSource remoteDataSource;
1010

@@ -92,4 +92,22 @@ class TvSeriesRepositoryImpl implements TvSeriesRepository {
9292
))
9393
.toList();
9494
}
95+
96+
@override
97+
Future<List<TvSeries>> getRecommendedTvSeries(int tvSeriesId) async {
98+
final models = await remoteDataSource.getRecommendedTvSeries(tvSeriesId);
99+
return models
100+
.map((e) => TvSeries(
101+
id: e.id,
102+
name: e.name,
103+
posterPath: e.posterPath,
104+
overview: e.overview,
105+
))
106+
.toList();
107+
}
108+
109+
@override
110+
Future<TvSeriesCreditModel> getTvSeriesCredits(int tvSeriesId) async {
111+
return await remoteDataSource.getTvSeriesCredits(tvSeriesId);
112+
}
95113
}

lib/features/tv_series/domain/repositories/entities/tv_series_repository.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'package:flutter_movie_clean_architecture/features/tv_series/data/models/tv_series_detail_model.dart';
1+
import 'package:flutter_movie_clean_architecture/features/tv_series/data/models/tv_series_credit_model.dart';
22
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/entities/tv_series.dart';
33
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/entities/tv_series_detail.dart';
44

@@ -9,4 +9,6 @@ abstract class TvSeriesRepository {
99
Future<List<TvSeries>> getUpcoming(int page);
1010
Future<TvSeriesDetail> getTvSeriesDetail(int tvSeriesId);
1111
Future<List<TvSeries>> searchTvSeries(String query);
12+
Future<List<TvSeries>> getRecommendedTvSeries(int tvSeriesId);
13+
Future<TvSeriesCreditModel> getTvSeriesCredits(int tvSeriesId);
1214
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/entities/tv_series.dart';
2+
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/repositories/entities/tv_series_repository.dart';
3+
4+
class GetRecommendedTvSeries {
5+
final TvSeriesRepository repository;
6+
7+
GetRecommendedTvSeries(this.repository);
8+
9+
Future<List<TvSeries>> call(int tvSeriesId) =>
10+
repository.getRecommendedTvSeries(tvSeriesId);
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import 'package:flutter_movie_clean_architecture/features/tv_series/data/models/tv_series_credit_model.dart';
2+
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/repositories/entities/tv_series_repository.dart';
3+
4+
class GetTvSeriesCredits {
5+
final TvSeriesRepository repository;
6+
7+
GetTvSeriesCredits(this.repository);
8+
9+
Future<TvSeriesCreditModel> call(int tvSeriesId) => repository.getTvSeriesCredits(tvSeriesId);
10+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/entities/tv_series.dart';
2+
import 'package:flutter_movie_clean_architecture/features/tv_series/domain/repositories/entities/tv_series_repository.dart';
3+
4+
class GetTvSeriesSearch {
5+
final TvSeriesRepository repository;
6+
7+
GetTvSeriesSearch(this.repository);
8+
9+
Future<List<TvSeries>> call(String query) async {
10+
return await repository.searchTvSeries(query);
11+
}
12+
}

0 commit comments

Comments
 (0)