Skip to content

Commit ce5cd07

Browse files
refactor(episode): adjust architecture
1 parent 18a27e1 commit ce5cd07

23 files changed

+639
-245
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"shared_preferences_ios","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_ios-2.1.1\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"shared_preferences_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_android-2.0.14\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"shared_preferences_macos","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_macos-2.0.4\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_linux-2.1.7\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_linux-2.1.1\\\\","native_build":false,"dependencies":["path_provider_linux"]}],"windows":[{"name":"path_provider_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_windows-2.1.3\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_windows-2.1.1\\\\","native_build":false,"dependencies":["path_provider_windows"]}],"web":[{"name":"shared_preferences_web","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_web-2.0.4\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_ios","shared_preferences_linux","shared_preferences_macos","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_ios","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]}],"date_created":"2022-10-24 02:06:35.109840","version":"3.0.5"}
1+
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"shared_preferences_ios","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_ios-2.1.1\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"shared_preferences_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_android-2.0.14\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"shared_preferences_macos","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_macos-2.0.4\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_linux-2.1.7\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_linux-2.1.1\\\\","native_build":false,"dependencies":["path_provider_linux"]}],"windows":[{"name":"path_provider_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_windows-2.1.3\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_windows-2.1.1\\\\","native_build":false,"dependencies":["path_provider_windows"]}],"web":[{"name":"shared_preferences_web","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_web-2.0.4\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_ios","shared_preferences_linux","shared_preferences_macos","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_ios","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]}],"date_created":"2022-11-17 03:46:23.513629","version":"3.0.5"}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
import '../models/character_model.dart';
3+
4+
abstract class ICharacterDataSource {
5+
Future<List<CharacterModel>> getListOfCharacters(List<int> ids);
6+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import '../models/episode_model.dart';
2+
3+
abstract class IEpisodeDataSource {
4+
Future<EpisodeModel> getEpisode(String id);
5+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import 'package:flutter_commons/flutter_commons.dart';
2+
3+
import '../datasources/character_datasource.dart';
4+
import '../models/character_model.dart';
5+
6+
class CharacterDataSource implements ICharacterDataSource {
7+
final DioService service;
8+
9+
CharacterDataSource(this.service);
10+
11+
@override
12+
Future<List<CharacterModel>> getListOfCharacters(List<int> ids) async {
13+
var response = await service.getMethod('${Constants.baseURL}${Constants.characterEndpoint}/$ids');
14+
15+
if (response.statusCode == 200) {
16+
List result = response.data as List;
17+
18+
return result.map((item) => CharacterModel.fromJson(item)).toList();
19+
} else {
20+
throw DataError();
21+
}
22+
}
23+
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import 'package:flutter_commons/flutter_commons.dart';
2+
import 'package:flutter_episodes/src/data/datasources/episode_datasource.dart';
3+
4+
import '../models/episode_model.dart';
5+
6+
class EpisodeDataSource implements IEpisodeDataSource {
7+
final DioService service;
8+
9+
EpisodeDataSource(this.service);
10+
11+
@override
12+
Future<EpisodeModel> getEpisode(String id) async {
13+
var response = await service.getMethod('${Constants.baseURL}${Constants.episodeEndpoint}/$id');
14+
15+
if (response.statusCode == 200) {
16+
var result = response.data;
17+
18+
return EpisodeModel.fromJson(result);
19+
} else {
20+
throw DataError();
21+
}
22+
}
23+
24+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import '../../domain/entities/character_entity.dart';
2+
3+
class CharacterModel extends CharacterEntity {
4+
CharacterModel({
5+
required super.id,
6+
required super.name,
7+
required super.status,
8+
required super.species,
9+
required super.type,
10+
required super.gender,
11+
required super.origin,
12+
required super.location,
13+
required super.image,
14+
required super.episode,
15+
required super.url,
16+
required super.created
17+
});
18+
19+
factory CharacterModel.fromJson(Map<String, dynamic> json) => CharacterModel(
20+
id: json["id"],
21+
name: json["name"],
22+
status: json["status"],
23+
species: json["species"],
24+
type: json["type"],
25+
gender: json["gender"],
26+
origin: CharacterLocationEntity.fromJson(json["origin"]),
27+
location: CharacterLocationEntity.fromJson(json["location"]),
28+
image: json["image"],
29+
episode: List<String>.from(json["episode"].map((x) => x)),
30+
url: json["url"],
31+
created: DateTime.parse(json["created"]),
32+
);
33+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'package:flutter_episodes/src/domain/entities/episode_entity.dart';
2+
3+
class EpisodeModel extends EpisodeEntity {
4+
EpisodeModel({
5+
required super.id,
6+
required super.name,
7+
required super.airDate,
8+
required super.episode,
9+
required super.characters,
10+
required super.url,
11+
required super.created
12+
});
13+
14+
factory EpisodeModel.fromJson(Map<String, dynamic> json) => EpisodeModel(
15+
id: json["id"],
16+
name: json["name"],
17+
airDate: json["air_date"],
18+
episode: json["episode"],
19+
characters: List<String>.from(json["characters"].map((x) => x)),
20+
url: json["url"],
21+
created: DateTime.parse(json["created"]),
22+
);
23+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import 'package:flutter_commons/flutter_commons.dart';
2+
import 'package:flutter_episodes/src/domain/entities/character_entity.dart';
3+
import 'package:dartz/dartz.dart';
4+
import 'package:flutter_episodes/src/domain/repositories/character_repository.dart';
5+
6+
import '../datasources/character_datasource.dart';
7+
import '../models/character_model.dart';
8+
9+
class CharacterRepository implements ICharacterRepository {
10+
final ICharacterDataSource dataSource;
11+
12+
CharacterRepository(this.dataSource);
13+
14+
@override
15+
Future<Either<Failure, List<CharacterEntity>>> getListOfCharacters(List<int> ids) async {
16+
List<CharacterModel> list;
17+
18+
try {
19+
list = await dataSource.getListOfCharacters(ids);
20+
} catch (e) {
21+
return left(DataError());
22+
}
23+
24+
// ignore: unnecessary_null_comparison
25+
return list == null ? left(DataError()) : right(list);
26+
}
27+
28+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'package:flutter_commons/flutter_commons.dart';
2+
import 'package:flutter_episodes/src/data/datasources/episode_datasource.dart';
3+
import 'package:flutter_episodes/src/data/models/episode_model.dart';
4+
import 'package:flutter_episodes/src/domain/entities/episode_entity.dart';
5+
import 'package:dartz/dartz.dart';
6+
import 'package:flutter_episodes/src/domain/repositories/episode_repository.dart';
7+
8+
class EpisodeRepository implements IEpisodeRepository {
9+
final IEpisodeDataSource dataSource;
10+
11+
EpisodeRepository(this.dataSource);
12+
13+
@override
14+
Future<Either<Failure, EpisodeEntity>> getEpisode(String id) async {
15+
EpisodeModel episode;
16+
17+
try {
18+
episode = await dataSource.getEpisode(id);
19+
} catch (e) {
20+
return left(DataError());
21+
}
22+
23+
// ignore: unnecessary_null_comparison
24+
return episode == null ? left(DataError()) : right(episode);
25+
}
26+
27+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
class CharacterEntity {
2+
CharacterEntity({
3+
required this.id,
4+
required this.name,
5+
required this.status,
6+
required this.species,
7+
required this.type,
8+
required this.gender,
9+
required this.origin,
10+
required this.location,
11+
required this.image,
12+
required this.episode,
13+
required this.url,
14+
required this.created,
15+
});
16+
17+
final int id;
18+
final String name;
19+
final String status;
20+
final String species;
21+
final String type;
22+
final String gender;
23+
final CharacterLocationEntity origin;
24+
final CharacterLocationEntity location;
25+
final String image;
26+
final List<String> episode;
27+
final String url;
28+
final DateTime created;
29+
30+
factory CharacterEntity.fromJson(Map<String, dynamic> json) => CharacterEntity(
31+
id: json["id"],
32+
name: json["name"],
33+
status: json["status"],
34+
species: json["species"],
35+
type: json["type"],
36+
gender: json["gender"],
37+
origin: CharacterLocationEntity.fromJson(json["origin"]),
38+
location: CharacterLocationEntity.fromJson(json["location"]),
39+
image: json["image"],
40+
episode: List<String>.from(json["episode"].map((x) => x)),
41+
url: json["url"],
42+
created: DateTime.parse(json["created"]),
43+
);
44+
45+
Map<String, dynamic> toJson() => {
46+
"id": id,
47+
"name": name,
48+
"status": status,
49+
"species": species,
50+
"type": type,
51+
"gender": gender,
52+
"origin": origin.toJson(),
53+
"location": location.toJson(),
54+
"image": image,
55+
"episode": List<dynamic>.from(episode.map((x) => x)),
56+
"url": url,
57+
"created": created.toIso8601String(),
58+
};
59+
}
60+
61+
class CharacterLocationEntity {
62+
CharacterLocationEntity({
63+
required this.name,
64+
required this.url,
65+
});
66+
67+
String name;
68+
String url;
69+
70+
factory CharacterLocationEntity.fromJson(Map<String, dynamic> json) => CharacterLocationEntity(
71+
name: json["name"],
72+
url: json["url"],
73+
);
74+
75+
Map<String, dynamic> toJson() => {
76+
"name": name,
77+
"url": url,
78+
};
79+
}

0 commit comments

Comments
 (0)