Remove json serializable code for exercise models

This commit is contained in:
Roland Geider
2025-11-03 17:29:26 +01:00
parent 1fcd01e14c
commit 120487682a
25 changed files with 1 additions and 1976 deletions

View File

@@ -16,25 +16,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import 'package:json_annotation/json_annotation.dart';
part 'alias.g.dart';
@JsonSerializable()
class Alias {
@JsonKey(required: true)
final int? id;
@JsonKey(name: 'translation')
final int? translationId;
@JsonKey(required: true)
final String alias;
const Alias({this.id, required this.translationId, required this.alias});
// Boilerplate
factory Alias.fromJson(Map<String, dynamic> json) => _$AliasFromJson(json);
Map<String, dynamic> toJson() => _$AliasToJson(this);
}

View File

@@ -1,22 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'alias.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Alias _$AliasFromJson(Map<String, dynamic> json) {
$checkKeys(json, requiredKeys: const ['id', 'alias']);
return Alias(
id: (json['id'] as num?)?.toInt(),
translationId: (json['translation'] as num?)?.toInt(),
alias: json['alias'] as String,
);
}
Map<String, dynamic> _$AliasToJson(Alias instance) => <String, dynamic>{
'id': instance.id,
'translation': instance.translationId,
'alias': instance.alias,
};

View File

@@ -17,16 +17,9 @@
*/
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
part 'category.g.dart';
@JsonSerializable()
class ExerciseCategory extends Equatable {
@JsonKey(required: true)
final int id;
@JsonKey(required: true)
final String name;
const ExerciseCategory({required this.id, required this.name});
@@ -36,10 +29,6 @@ class ExerciseCategory extends Equatable {
return 'Category $id: $name';
}
// Boilerplate
factory ExerciseCategory.fromJson(Map<String, dynamic> json) => _$ExerciseCategoryFromJson(json);
Map<String, dynamic> toJson() => _$ExerciseCategoryToJson(this);
@override
List<Object?> get props => [id, name];
}

View File

@@ -1,20 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'category.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
ExerciseCategory _$ExerciseCategoryFromJson(Map<String, dynamic> json) {
$checkKeys(json, requiredKeys: const ['id', 'name']);
return ExerciseCategory(
id: (json['id'] as num).toInt(),
name: json['name'] as String,
);
}
Map<String, dynamic> _$ExerciseCategoryToJson(ExerciseCategory instance) => <String, dynamic>{
'id': instance.id,
'name': instance.name,
};

View File

@@ -16,19 +16,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import 'package:json_annotation/json_annotation.dart';
part 'comment.g.dart';
@JsonSerializable()
class Comment {
@JsonKey(required: true)
final int id;
@JsonKey(name: 'translation')
final int translationId;
@JsonKey(required: true)
final String comment;
const Comment({
@@ -36,9 +26,4 @@ class Comment {
required this.translationId,
required this.comment,
});
// Boilerplate
factory Comment.fromJson(Map<String, dynamic> json) => _$CommentFromJson(json);
Map<String, dynamic> toJson() => _$CommentToJson(this);
}

View File

@@ -1,22 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'comment.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Comment _$CommentFromJson(Map<String, dynamic> json) {
$checkKeys(json, requiredKeys: const ['id', 'comment']);
return Comment(
id: (json['id'] as num).toInt(),
translationId: (json['translation'] as num).toInt(),
comment: json['comment'] as String,
);
}
Map<String, dynamic> _$CommentToJson(Comment instance) => <String, dynamic>{
'id': instance.id,
'translation': instance.translationId,
'comment': instance.comment,
};

View File

@@ -17,24 +17,13 @@
*/
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
part 'equipment.g.dart';
@JsonSerializable()
class Equipment extends Equatable {
@JsonKey(required: true)
final int id;
@JsonKey(required: true)
final String name;
const Equipment({required this.id, required this.name});
// Boilerplate
factory Equipment.fromJson(Map<String, dynamic> json) => _$EquipmentFromJson(json);
Map<String, dynamic> toJson() => _$EquipmentToJson(this);
@override
List<Object?> get props => [id, name];

View File

@@ -1,20 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'equipment.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Equipment _$EquipmentFromJson(Map<String, dynamic> json) {
$checkKeys(json, requiredKeys: const ['id', 'name']);
return Equipment(
id: (json['id'] as num).toInt(),
name: json['name'] as String,
);
}
Map<String, dynamic> _$EquipmentToJson(Equipment instance) => <String, dynamic>{
'id': instance.id,
'name': instance.name,
};

View File

@@ -15,83 +15,39 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import 'dart:developer';
import 'package:collection/collection.dart';
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:logging/logging.dart';
import 'package:wger/helpers/consts.dart';
import 'package:wger/models/exercises/category.dart';
import 'package:wger/models/exercises/equipment.dart';
import 'package:wger/models/exercises/exercise_api.dart';
import 'package:wger/models/exercises/image.dart';
import 'package:wger/models/exercises/language.dart';
import 'package:wger/models/exercises/muscle.dart';
import 'package:wger/models/exercises/translation.dart';
import 'package:wger/models/exercises/video.dart';
part 'exercise.g.dart';
@JsonSerializable(explicitToJson: true)
class Exercise extends Equatable {
final _logger = Logger('ExerciseModel');
@JsonKey(required: true)
late final int id;
@JsonKey(required: true)
late final String uuid;
@JsonKey(required: true, name: 'variations')
late final int? variationId;
@JsonKey(required: true, name: 'created')
late final DateTime? created;
@JsonKey(required: true, name: 'last_update')
late final DateTime? lastUpdate;
@JsonKey(required: true, name: 'last_update_global')
late final DateTime? lastUpdateGlobal;
@JsonKey(required: true, name: 'category')
late int categoryId;
@JsonKey(includeFromJson: true, includeToJson: true, name: 'categories')
ExerciseCategory? category;
@JsonKey(required: true, name: 'muscles')
List<int> musclesIds = [];
@JsonKey(includeFromJson: false, includeToJson: false)
List<Muscle> muscles = [];
@JsonKey(required: true, name: 'muscles_secondary')
List<int> musclesSecondaryIds = [];
@JsonKey(includeFromJson: false, includeToJson: true)
List<Muscle> musclesSecondary = [];
@JsonKey(required: true, name: 'equipment')
List<int> equipmentIds = [];
@JsonKey(includeFromJson: false, includeToJson: false)
List<Equipment> equipment = [];
@JsonKey(includeFromJson: false, includeToJson: false)
List<ExerciseImage> images = [];
@JsonKey(includeFromJson: true, includeToJson: false)
List<Translation> translations = [];
@JsonKey(includeFromJson: false, includeToJson: false)
List<Video> videos = [];
@JsonKey(includeFromJson: false, includeToJson: false)
List<String> authors = [];
@JsonKey(includeFromJson: false, includeToJson: false)
List<String> authorsGlobal = [];
Exercise({
@@ -149,47 +105,6 @@ class Exercise extends Equatable {
bool get showPlateCalculator => equipment.map((e) => e.id).contains(ID_EQUIPMENT_BARBELL);
Exercise.fromApiDataString(String baseData, List<Language> languages)
: this.fromApiData(ExerciseApiData.fromString(baseData), languages);
Exercise.fromApiDataJson(Map<String, dynamic> baseData, List<Language> languages)
: this.fromApiData(ExerciseApiData.fromJson(baseData), languages);
Exercise.fromApiData(ExerciseApiData exerciseData, List<Language> languages) {
id = exerciseData.id;
uuid = exerciseData.uuid;
categoryId = exerciseData.category.id;
category = exerciseData.category;
created = exerciseData.created;
lastUpdate = exerciseData.lastUpdate;
// lastUpdateGlobal = exerciseData.lastUpdateGlobal;
musclesSecondary = exerciseData.muscles;
muscles = exerciseData.muscles;
equipment = exerciseData.equipment;
category = exerciseData.category;
translations = exerciseData.translations.map((e) {
e.language = languages.firstWhere(
(l) => l.id == e.languageId,
// workaround for https://github.com/wger-project/flutter/issues/722
orElse: () {
log('Could not find language for translation ${e.languageId}');
return Language(id: e.languageId, shortName: 'unknown', fullName: 'unknown');
},
);
return e;
}).toList();
videos = exerciseData.videos;
images = exerciseData.images;
authors = exerciseData.authors;
authorsGlobal = exerciseData.authorsGlobal;
variationId = exerciseData.variationId;
}
/// Returns translation for the given language
///
/// If no translation is found, English will be returned
@@ -226,11 +141,6 @@ class Exercise extends Equatable {
this.category = category;
}
// Boilerplate
factory Exercise.fromJson(Map<String, dynamic> json) => _$ExerciseFromJson(json);
Map<String, dynamic> toJson() => _$ExerciseToJson(this);
@override
List<Object?> get props => [
id,

View File

@@ -1,66 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'exercise.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Exercise _$ExerciseFromJson(Map<String, dynamic> json) {
$checkKeys(
json,
requiredKeys: const [
'id',
'uuid',
'variations',
'created',
'last_update',
'last_update_global',
'category',
'muscles',
'muscles_secondary',
'equipment',
],
);
return Exercise(
id: (json['id'] as num).toInt(),
uuid: json['uuid'] as String,
created: json['created'] == null ? null : DateTime.parse(json['created'] as String),
lastUpdate: json['last_update'] == null
? null
: DateTime.parse(json['last_update'] as String),
variationId: (json['variations'] as num?)?.toInt(),
categoryId: (json['category'] as num).toInt(),
translations: (json['translations'] as List<dynamic>?)
?.map((e) => Translation.fromJson(e as Map<String, dynamic>))
.toList(),
category: json['categories'] == null
? null
: ExerciseCategory.fromJson(
json['categories'] as Map<String, dynamic>,
),
)
..lastUpdateGlobal = json['last_update_global'] == null
? null
: DateTime.parse(json['last_update_global'] as String)
..musclesIds = (json['muscles'] as List<dynamic>).map((e) => (e as num).toInt()).toList()
..musclesSecondaryIds = (json['muscles_secondary'] as List<dynamic>)
.map((e) => (e as num).toInt())
.toList()
..equipmentIds = (json['equipment'] as List<dynamic>).map((e) => (e as num).toInt()).toList();
}
Map<String, dynamic> _$ExerciseToJson(Exercise instance) => <String, dynamic>{
'id': instance.id,
'uuid': instance.uuid,
'variations': instance.variationId,
'created': instance.created?.toIso8601String(),
'last_update': instance.lastUpdate?.toIso8601String(),
'last_update_global': instance.lastUpdateGlobal?.toIso8601String(),
'category': instance.categoryId,
'categories': instance.category?.toJson(),
'muscles': instance.musclesIds,
'muscles_secondary': instance.musclesSecondaryIds,
'musclesSecondary': instance.musclesSecondary.map((e) => e.toJson()).toList(),
'equipment': instance.equipmentIds,
};

View File

@@ -1,91 +0,0 @@
import 'dart:convert';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:wger/models/exercises/category.dart';
import 'package:wger/models/exercises/equipment.dart';
import 'package:wger/models/exercises/image.dart';
import 'package:wger/models/exercises/muscle.dart';
import 'package:wger/models/exercises/translation.dart';
import 'package:wger/models/exercises/video.dart';
part 'exercise_api.freezed.dart';
part 'exercise_api.g.dart';
/// Model for an exercise as returned from the exerciseinfo endpoint
///
/// Basically this is just used as a convenience to create "real" exercise
/// objects and nothing more
@freezed
sealed class ExerciseApiData with _$ExerciseApiData {
factory ExerciseApiData({
required int id,
required String uuid,
// ignore: invalid_annotation_target
@Default(null) @JsonKey(name: 'variations') int? variationId,
// ignore: invalid_annotation_target
@JsonKey(name: 'created') required DateTime created,
// ignore: invalid_annotation_target
@JsonKey(name: 'last_update') required DateTime lastUpdate,
// ignore: invalid_annotation_target
@JsonKey(name: 'last_update_global') required DateTime lastUpdateGlobal,
required ExerciseCategory category,
required List<Muscle> muscles,
// ignore: invalid_annotation_target
@JsonKey(name: 'muscles_secondary') required List<Muscle> musclesSecondary,
// ignore: invalid_annotation_target
required List<Equipment> equipment,
// ignore: invalid_annotation_target
@JsonKey(name: 'translations', defaultValue: []) required List<Translation> translations,
required List<ExerciseImage> images,
required List<Video> videos,
// ignore: invalid_annotation_target
@JsonKey(name: 'author_history') required List<String> authors,
// ignore: invalid_annotation_target
@JsonKey(name: 'total_authors_history') required List<String> authorsGlobal,
}) = _ExerciseBaseData;
factory ExerciseApiData.fromString(String input) => _$ExerciseApiDataFromJson(json.decode(input));
factory ExerciseApiData.fromJson(Map<String, dynamic> json) => _$ExerciseApiDataFromJson(json);
}
/// Model for the search results returned from the /api/v2/exercise/search endpoint
///
@freezed
sealed class ExerciseSearchDetails with _$ExerciseSearchDetails {
factory ExerciseSearchDetails({
// ignore: invalid_annotation_target
@JsonKey(name: 'id') required int translationId,
// ignore: invalid_annotation_target
@JsonKey(name: 'base_id') required int exerciseId,
required String name,
required String category,
required String? image,
// ignore: invalid_annotation_target
@JsonKey(name: 'image_thumbnail') required String? imageThumbnail,
}) = _ExerciseSearchDetails;
factory ExerciseSearchDetails.fromJson(Map<String, dynamic> json) =>
_$ExerciseSearchDetailsFromJson(json);
}
@freezed
sealed class ExerciseSearchEntry with _$ExerciseSearchEntry {
factory ExerciseSearchEntry({
required String value,
required ExerciseSearchDetails data,
}) = _ExerciseSearchEntry;
factory ExerciseSearchEntry.fromJson(Map<String, dynamic> json) =>
_$ExerciseSearchEntryFromJson(json);
}
@freezed
sealed class ExerciseApiSearch with _$ExerciseApiSearch {
factory ExerciseApiSearch({
required List<ExerciseSearchEntry> suggestions,
}) = _ExerciseApiSearch;
factory ExerciseApiSearch.fromJson(Map<String, dynamic> json) =>
_$ExerciseApiSearchFromJson(json);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,103 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'exercise_api.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_ExerciseBaseData _$ExerciseBaseDataFromJson(Map<String, dynamic> json) => _ExerciseBaseData(
id: (json['id'] as num).toInt(),
uuid: json['uuid'] as String,
variationId: (json['variations'] as num?)?.toInt() ?? null,
created: DateTime.parse(json['created'] as String),
lastUpdate: DateTime.parse(json['last_update'] as String),
lastUpdateGlobal: DateTime.parse(json['last_update_global'] as String),
category: ExerciseCategory.fromJson(
json['category'] as Map<String, dynamic>,
),
muscles: (json['muscles'] as List<dynamic>)
.map((e) => Muscle.fromJson(e as Map<String, dynamic>))
.toList(),
musclesSecondary: (json['muscles_secondary'] as List<dynamic>)
.map((e) => Muscle.fromJson(e as Map<String, dynamic>))
.toList(),
equipment: (json['equipment'] as List<dynamic>)
.map((e) => Equipment.fromJson(e as Map<String, dynamic>))
.toList(),
translations:
(json['translations'] as List<dynamic>?)
?.map((e) => Translation.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
images: (json['images'] as List<dynamic>)
.map((e) => ExerciseImage.fromJson(e as Map<String, dynamic>))
.toList(),
videos: (json['videos'] as List<dynamic>)
.map((e) => Video.fromJson(e as Map<String, dynamic>))
.toList(),
authors: (json['author_history'] as List<dynamic>).map((e) => e as String).toList(),
authorsGlobal: (json['total_authors_history'] as List<dynamic>).map((e) => e as String).toList(),
);
Map<String, dynamic> _$ExerciseBaseDataToJson(_ExerciseBaseData instance) => <String, dynamic>{
'id': instance.id,
'uuid': instance.uuid,
'variations': instance.variationId,
'created': instance.created.toIso8601String(),
'last_update': instance.lastUpdate.toIso8601String(),
'last_update_global': instance.lastUpdateGlobal.toIso8601String(),
'category': instance.category,
'muscles': instance.muscles,
'muscles_secondary': instance.musclesSecondary,
'equipment': instance.equipment,
'translations': instance.translations,
'images': instance.images,
'videos': instance.videos,
'author_history': instance.authors,
'total_authors_history': instance.authorsGlobal,
};
_ExerciseSearchDetails _$ExerciseSearchDetailsFromJson(
Map<String, dynamic> json,
) => _ExerciseSearchDetails(
translationId: (json['id'] as num).toInt(),
exerciseId: (json['base_id'] as num).toInt(),
name: json['name'] as String,
category: json['category'] as String,
image: json['image'] as String?,
imageThumbnail: json['image_thumbnail'] as String?,
);
Map<String, dynamic> _$ExerciseSearchDetailsToJson(
_ExerciseSearchDetails instance,
) => <String, dynamic>{
'id': instance.translationId,
'base_id': instance.exerciseId,
'name': instance.name,
'category': instance.category,
'image': instance.image,
'image_thumbnail': instance.imageThumbnail,
};
_ExerciseSearchEntry _$ExerciseSearchEntryFromJson(Map<String, dynamic> json) =>
_ExerciseSearchEntry(
value: json['value'] as String,
data: ExerciseSearchDetails.fromJson(
json['data'] as Map<String, dynamic>,
),
);
Map<String, dynamic> _$ExerciseSearchEntryToJson(
_ExerciseSearchEntry instance,
) => <String, dynamic>{'value': instance.value, 'data': instance.data};
_ExerciseApiSearch _$ExerciseApiSearchFromJson(Map<String, dynamic> json) => _ExerciseApiSearch(
suggestions: (json['suggestions'] as List<dynamic>)
.map((e) => ExerciseSearchEntry.fromJson(e as Map<String, dynamic>))
.toList(),
);
Map<String, dynamic> _$ExerciseApiSearchToJson(_ExerciseApiSearch instance) => <String, dynamic>{
'suggestions': instance.suggestions,
};

View File

@@ -16,25 +16,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import 'package:json_annotation/json_annotation.dart';
part 'image.g.dart';
@JsonSerializable()
class ExerciseImage {
@JsonKey(required: true)
final int id;
@JsonKey(required: true)
final String uuid;
@JsonKey(required: true, name: 'exercise')
final int exerciseId;
@JsonKey(required: true, name: 'image')
final String url;
@JsonKey(name: 'is_main', defaultValue: false)
final bool isMain;
const ExerciseImage({
@@ -45,11 +31,6 @@ class ExerciseImage {
required this.isMain,
});
// Boilerplate
factory ExerciseImage.fromJson(Map<String, dynamic> json) => _$ExerciseImageFromJson(json);
Map<String, dynamic> toJson() => _$ExerciseImageToJson(this);
@override
String toString() {
return 'Image $id: $url';

View File

@@ -1,26 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'image.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
ExerciseImage _$ExerciseImageFromJson(Map<String, dynamic> json) {
$checkKeys(json, requiredKeys: const ['id', 'uuid', 'exercise', 'image']);
return ExerciseImage(
id: (json['id'] as num).toInt(),
uuid: json['uuid'] as String,
exerciseId: (json['exercise'] as num).toInt(),
url: json['image'] as String,
isMain: json['is_main'] as bool? ?? false,
);
}
Map<String, dynamic> _$ExerciseImageToJson(ExerciseImage instance) => <String, dynamic>{
'id': instance.id,
'uuid': instance.uuid,
'exercise': instance.exerciseId,
'image': instance.url,
'is_main': instance.isMain,
};

View File

@@ -18,23 +18,12 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/widgets.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:wger/helpers/i18n.dart';
part 'muscle.g.dart';
@JsonSerializable()
class Muscle extends Equatable {
@JsonKey(required: true)
final int id;
@JsonKey(required: true)
final String name;
@JsonKey(required: true, name: 'name_en')
final String nameEn;
@JsonKey(required: true, name: 'is_front')
final bool isFront;
const Muscle({
@@ -44,11 +33,6 @@ class Muscle extends Equatable {
required this.isFront,
});
// Boilerplate
factory Muscle.fromJson(Map<String, dynamic> json) => _$MuscleFromJson(json);
Map<String, dynamic> toJson() => _$MuscleToJson(this);
@override
List<Object?> get props => [id, name, isFront];

View File

@@ -1,24 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'muscle.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Muscle _$MuscleFromJson(Map<String, dynamic> json) {
$checkKeys(json, requiredKeys: const ['id', 'name', 'name_en', 'is_front']);
return Muscle(
id: (json['id'] as num).toInt(),
name: json['name'] as String,
nameEn: json['name_en'] as String,
isFront: json['is_front'] as bool,
);
}
Map<String, dynamic> _$MuscleToJson(Muscle instance) => <String, dynamic>{
'id': instance.id,
'name': instance.name,
'name_en': instance.nameEn,
'is_front': instance.isFront,
};

View File

@@ -17,44 +17,22 @@
*/
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:wger/models/exercises/alias.dart';
import 'package:wger/models/exercises/comment.dart';
import 'package:wger/models/exercises/exercise.dart';
import 'package:wger/models/exercises/language.dart';
part 'translation.g.dart';
@JsonSerializable()
class Translation extends Equatable {
@JsonKey(required: true)
final int? id;
@JsonKey(required: true)
final String? uuid;
@JsonKey(required: true, name: 'language')
late int languageId;
@JsonKey(includeFromJson: false, includeToJson: false)
late Language languageObj;
@JsonKey(required: true, name: 'created')
final DateTime? created;
@JsonKey(required: true, name: 'exercise')
late int? exerciseId;
@JsonKey(required: true)
final String name;
@JsonKey(required: true)
final String description;
@JsonKey(includeFromJson: true, includeToJson: false)
List<Comment> notes = [];
@JsonKey(includeFromJson: true, includeToJson: false)
List<Alias> aliases = [];
Translation({
@@ -85,11 +63,6 @@ class Translation extends Equatable {
languageId = language.id;
}
// Boilerplate
factory Translation.fromJson(Map<String, dynamic> json) => _$TranslationFromJson(json);
Map<String, dynamic> toJson() => _$TranslationToJson(this);
@override
List<Object?> get props => [
id,

View File

@@ -1,47 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'translation.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Translation _$TranslationFromJson(Map<String, dynamic> json) {
$checkKeys(
json,
requiredKeys: const [
'id',
'uuid',
'language',
'created',
'exercise',
'name',
'description',
],
);
return Translation(
id: (json['id'] as num?)?.toInt(),
uuid: json['uuid'] as String?,
created: json['created'] == null ? null : DateTime.parse(json['created'] as String),
name: json['name'] as String,
description: json['description'] as String,
exerciseId: (json['exercise'] as num?)?.toInt(),
)
..languageId = (json['language'] as num).toInt()
..notes = (json['notes'] as List<dynamic>)
.map((e) => Comment.fromJson(e as Map<String, dynamic>))
.toList()
..aliases = (json['aliases'] as List<dynamic>)
.map((e) => Alias.fromJson(e as Map<String, dynamic>))
.toList();
}
Map<String, dynamic> _$TranslationToJson(Translation instance) => <String, dynamic>{
'id': instance.id,
'uuid': instance.uuid,
'language': instance.languageId,
'created': instance.created?.toIso8601String(),
'exercise': instance.exerciseId,
'name': instance.name,
'description': instance.description,
};

View File

@@ -16,18 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import 'package:json_annotation/json_annotation.dart';
part 'variation.g.dart';
@JsonSerializable()
class Variation {
@JsonKey(required: true)
final int id;
const Variation({required this.id});
// Boilerplate
factory Variation.fromJson(Map<String, dynamic> json) => _$VariationFromJson(json);
Map<String, dynamic> toJson() => _$VariationToJson(this);
}

View File

@@ -1,16 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'variation.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Variation _$VariationFromJson(Map<String, dynamic> json) {
$checkKeys(json, requiredKeys: const ['id']);
return Variation(id: (json['id'] as num).toInt());
}
Map<String, dynamic> _$VariationToJson(Variation instance) => <String, dynamic>{
'id': instance.id,
};

View File

@@ -16,49 +16,21 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import 'package:json_annotation/json_annotation.dart';
import 'package:wger/helpers/json.dart';
part 'video.g.dart';
@JsonSerializable()
class Video {
@JsonKey(required: true)
final int id;
@JsonKey(required: true)
final String uuid;
@JsonKey(name: 'video', required: true)
final String url;
Uri get uri => Uri.parse(url);
@JsonKey(name: 'exercise', required: true)
final int exerciseId;
@JsonKey(required: true)
final int size;
@JsonKey(required: true, fromJson: stringToNum, toJson: numToString)
final num duration;
@JsonKey(required: true)
final int width;
@JsonKey(required: true)
final int height;
@JsonKey(required: true)
final String codec;
@JsonKey(name: 'codec_long', required: true)
final String codecLong;
@JsonKey(required: true, name: 'license')
final int licenseId;
@JsonKey(name: 'license_author', required: true)
final String? licenseAuthor;
const Video({
@@ -75,9 +47,4 @@ class Video {
required this.licenseId,
required this.licenseAuthor,
});
// Boilerplate
factory Video.fromJson(Map<String, dynamic> json) => _$VideoFromJson(json);
Map<String, dynamic> toJson() => _$VideoToJson(this);
}

View File

@@ -1,56 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'video.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Video _$VideoFromJson(Map<String, dynamic> json) {
$checkKeys(
json,
requiredKeys: const [
'id',
'uuid',
'video',
'exercise',
'size',
'duration',
'width',
'height',
'codec',
'codec_long',
'license',
'license_author',
],
);
return Video(
id: (json['id'] as num).toInt(),
uuid: json['uuid'] as String,
exerciseId: (json['exercise'] as num).toInt(),
size: (json['size'] as num).toInt(),
url: json['video'] as String,
duration: stringToNum(json['duration'] as String?),
width: (json['width'] as num).toInt(),
height: (json['height'] as num).toInt(),
codec: json['codec'] as String,
codecLong: json['codec_long'] as String,
licenseId: (json['license'] as num).toInt(),
licenseAuthor: json['license_author'] as String?,
);
}
Map<String, dynamic> _$VideoToJson(Video instance) => <String, dynamic>{
'id': instance.id,
'uuid': instance.uuid,
'video': instance.url,
'exercise': instance.exerciseId,
'size': instance.size,
'duration': numToString(instance.duration),
'width': instance.width,
'height': instance.height,
'codec': instance.codec,
'codec_long': instance.codecLong,
'license': instance.licenseId,
'license_author': instance.licenseAuthor,
};

View File

@@ -245,10 +245,6 @@ final class ExerciseStateNotifier extends _$ExerciseStateNotifier {
// TODO: fix this! Why is the ref of stateProvider always disposed?
return state.exercises.where((e) => ids.contains(e.id)).toList();
return (result['results'] as List)
.map((data) => Exercise.fromApiDataJson(data as Map<String, dynamic>, []))
.toList();
}
Future<List<Exercise>> searchExerciseLocal(

View File

@@ -74,7 +74,7 @@ final class ExerciseStateNotifierProvider
}
}
String _$exerciseStateNotifierHash() => r'15a583c2d00b76fc792103db1b923e6a07bd1fc2';
String _$exerciseStateNotifierHash() => r'95653998a71d77da4e390260738a95767bb1aae1';
abstract class _$ExerciseStateNotifier extends $Notifier<ExerciseState> {
ExerciseState build();