feat(service): Add working database persistency

This commit is contained in:
2023-02-04 00:25:16 +01:00
parent 624c8bd78a
commit 432796d0c4
10 changed files with 538 additions and 67 deletions

View File

@@ -1,50 +1,64 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'anime.freezed.dart';
part 'anime.g.dart';
/// The watch state of an anime
enum AnimeTrackingState {
watching,
completed,
planToWatch,
dropped,
watching, // 0
completed, // 1
planToWatch, // 2
dropped, // 3
}
extension AnimeTrackStateExtension on AnimeTrackingState {
int toInteger() {
switch (this) {
case AnimeTrackingState.watching: return 0;
case AnimeTrackingState.completed: return 1;
case AnimeTrackingState.planToWatch: return 2;
case AnimeTrackingState.dropped: return 3;
}
}
}
class AnimeTrackingStateConverter implements JsonConverter<AnimeTrackingState, int> {
const AnimeTrackingStateConverter();
@override
AnimeTrackingState fromJson(int json) {
switch (json) {
case 0: return AnimeTrackingState.watching;
case 1: return AnimeTrackingState.completed;
case 2: return AnimeTrackingState.planToWatch;
case 3: return AnimeTrackingState.dropped;
}
return AnimeTrackingState.planToWatch;
}
@override
int toJson(AnimeTrackingState state) => state.toInteger();
}
/// Data about a tracked anime
class AnimeTrackingData {
const AnimeTrackingData(
this.id,
this.state,
this.title,
this.episodesWatched,
this.episodesTotal,
this.thumbnailUrl,
);
/// The ID of the anime
final String id;
/// The state of the anime
final AnimeTrackingState state;
/// The title of the anime
final String title;
/// Episodes in total.
final int? episodesTotal;
/// Episodes watched.
final int episodesWatched;
/// URL to the thumbnail/cover art for the anime.
final String thumbnailUrl;
AnimeTrackingData copyWith(
@freezed
class AnimeTrackingData with _$AnimeTrackingData{
factory AnimeTrackingData(
/// The ID of the anime
String id,
/// The state of the anime
@AnimeTrackingStateConverter() AnimeTrackingState state,
/// The title of the anime
String title,
/// Episodes in total.
int episodesWatched,
) {
return AnimeTrackingData(
id,
state,
title,
episodesWatched,
episodesTotal,
thumbnailUrl,
);
}
/// Episodes watched.
int? episodesTotal,
/// URL to the thumbnail/cover art for the anime.
String thumbnailUrl,
) = _AnimeTrackingData;
/// JSON
factory AnimeTrackingData.fromJson(Map<String, dynamic> json) => _$AnimeTrackingDataFromJson(json);
}