Skip to content

Commit 66ca835

Browse files
authored
Merge pull request #8 from piashcse/feat-cast
Add movie credits feature
2 parents 94ce839 + 4e03936 commit 66ca835

File tree

14 files changed

+270
-23
lines changed

14 files changed

+270
-23
lines changed

lib/features/movie/data/datasources/movie_remote_data_source.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:dio/dio.dart';
2+
import 'package:flutter_movie_clean_architecture/features/movie/data/models/credit_model.dart';
23
import 'package:flutter_movie_clean_architecture/features/movie/data/models/movie_detail_model.dart';
34
import 'package:flutter_movie_clean_architecture/features/movie/data/models/movie_model.dart';
45

@@ -64,4 +65,9 @@ class MovieRemoteDataSource {
6465
.map((e) => MovieModel.fromJson(e))
6566
.toList();
6667
}
68+
Future<Credit> getMovieCredits(int movieId) async {
69+
final response =
70+
await dio.get('movie/$movieId/credits');
71+
return Credit.fromJson(response.data as Map<String, dynamic>);
72+
}
6773
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import 'package:freezed_annotation/freezed_annotation.dart';
2+
3+
part 'credit_model.freezed.dart';
4+
part 'credit_model.g.dart';
5+
6+
@freezed
7+
class Credit with _$Credit {
8+
const factory Credit({
9+
required int id,
10+
List<Cast>? cast,
11+
List<Crew>? crew,
12+
}) = _Credit;
13+
14+
factory Credit.fromJson(Map<String, dynamic> json) => _$CreditFromJson(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: 'cast_id') int? castId,
29+
String? character,
30+
@JsonKey(name: 'credit_id') String? creditId,
31+
int? order,
32+
}) = _Cast;
33+
34+
factory Cast.fromJson(Map<String, dynamic> json) => _$CastFromJson(json);
35+
}
36+
37+
@freezed
38+
class Crew with _$Crew {
39+
const factory Crew({
40+
required int id,
41+
bool? adult,
42+
int? gender,
43+
@JsonKey(name: 'known_for_department') String? knownForDepartment,
44+
String? name,
45+
@JsonKey(name: 'original_name') String? originalName,
46+
double? popularity,
47+
@JsonKey(name: 'profile_path') String? profilePath,
48+
@JsonKey(name: 'credit_id') String? creditId,
49+
String? department,
50+
String? job,
51+
}) = _Crew;
52+
53+
factory Crew.fromJson(Map<String, dynamic> json) => _$CrewFromJson(json);
54+
}

lib/features/movie/data/repositories/movie_repository_impl.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:flutter_movie_clean_architecture/features/movie/data/datasources/movie_remote_data_source.dart';
2+
import 'package:flutter_movie_clean_architecture/features/movie/data/models/credit_model.dart';
23
import 'package:flutter_movie_clean_architecture/features/movie/domain/entities/movie.dart';
34
import 'package:flutter_movie_clean_architecture/features/movie/domain/entities/movie_detail.dart';
45
import 'package:flutter_movie_clean_architecture/features/movie/domain/repositories/entities/movie_repository.dart';
@@ -106,4 +107,14 @@ class MovieRepositoryImpl implements MovieRepository {
106107
))
107108
.toList();
108109
}
110+
111+
@override
112+
Future<Credit> getMovieCredits(int movieId) async {
113+
final model = await remoteDataSource.getMovieCredits(movieId);
114+
return Credit(
115+
id: model.id,
116+
cast: model.cast,
117+
crew: model.crew,
118+
);
119+
}
109120
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Credit {
2+
final int id;
3+
final List<Cast>? cast;
4+
final List<Crew>? crew;
5+
6+
Credit({
7+
required this.id,
8+
required this.cast,
9+
required this.crew,
10+
});
11+
}
12+
13+
class Cast {
14+
final int id;
15+
final String name;
16+
final String? profilePath;
17+
18+
Cast({
19+
required this.id,
20+
required this.name,
21+
required this.profilePath,
22+
});
23+
}
24+
25+
class Crew {
26+
final int id;
27+
final String name;
28+
final String? profilePath;
29+
30+
Crew({
31+
required this.id,
32+
required this.name,
33+
required this.profilePath,
34+
});
35+
}

lib/features/movie/domain/repositories/entities/movie_repository.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:flutter_movie_clean_architecture/features/movie/data/models/credit_model.dart';
12
import 'package:flutter_movie_clean_architecture/features/movie/domain/entities/movie.dart';
23
import 'package:flutter_movie_clean_architecture/features/movie/domain/entities/movie_detail.dart';
34

@@ -9,4 +10,5 @@ abstract class MovieRepository {
910
Future<MovieDetail> getMovieDetail(int movieId);
1011
Future<List<Movie>> getMovieSearch(String query);
1112
Future<List<Movie>> getRecommendedMovie(int movieId);
13+
Future<Credit> getMovieCredits(int movieId);
1214
}
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/movie/data/models/credit_model.dart';
2+
import 'package:flutter_movie_clean_architecture/features/movie/domain/repositories/entities/movie_repository.dart';
3+
4+
class GetMovieCredits {
5+
final MovieRepository repository;
6+
7+
GetMovieCredits(this.repository);
8+
9+
Future<Credit> call(int movieId) => repository.getMovieCredits(movieId);
10+
}

0 commit comments

Comments
 (0)