From 27340fc10aa2cde03d12a27cae1ccd753d0fcc79 Mon Sep 17 00:00:00 2001 From: Efrain Date: Wed, 19 Jan 2022 17:47:05 -0500 Subject: [PATCH] [Infrastructure] Added data logic (team characters / weapons) --- .../custom_builds_data_service.dart | 110 ++++++++++++++---- 1 file changed, 87 insertions(+), 23 deletions(-) diff --git a/lib/infrastructure/persistence/custom_builds_data_service.dart b/lib/infrastructure/persistence/custom_builds_data_service.dart index fc4a85fd7..9bf5980d6 100644 --- a/lib/infrastructure/persistence/custom_builds_data_service.dart +++ b/lib/infrastructure/persistence/custom_builds_data_service.dart @@ -9,44 +9,46 @@ class CustomBuildsDataServiceImpl implements CustomBuildsDataService { final GenshinService _genshinService; late Box _buildsBox; + late Box _weaponsBox; late Box _artifactsBox; late Box _notesBox; + late Box _teamCharactersBox; CustomBuildsDataServiceImpl(this._genshinService); @override Future init() async { _buildsBox = await Hive.openBox('customBuilds'); + _weaponsBox = await Hive.openBox('customBuildWeapons'); _artifactsBox = await Hive.openBox('customBuildArtifacts'); _notesBox = await Hive.openBox('customBuildNotes'); + _teamCharactersBox = await Hive.openBox('customBuildTeamCharacters'); } @override Future deleteThemAll() { return Future.wait([ _buildsBox.clear(), + _weaponsBox.clear(), _artifactsBox.clear(), _notesBox.clear(), + _teamCharactersBox.clear(), ]); } @override List getAllCustomBuilds() { - return _buildsBox.values.map((e) { - final key = e.key as int; - final notes = _notesBox.values.where((el) => el.buildItemKey == key).toList(); - final artifacts = _artifactsBox.values.where((el) => el.buildItemKey == key).toList(); - return _mapToCustomBuildModel(e, notes, artifacts); - }).toList() - ..sort((x, y) => x.character.name.compareTo(y.character.name)); + return _buildsBox.values.map((e) => getCustomBuild(e.key as int)).toList()..sort((x, y) => x.character.name.compareTo(y.character.name)); } @override CustomBuildModel getCustomBuild(int key) { final build = _buildsBox.values.firstWhere((e) => e.key == key); final notes = _notesBox.values.where((el) => el.buildItemKey == key).toList(); + final weapons = _weaponsBox.values.where((el) => el.buildItemKey == key).toList(); final artifacts = _artifactsBox.values.where((el) => el.buildItemKey == key).toList(); - return _mapToCustomBuildModel(build, notes, artifacts); + final teamCharacters = _teamCharactersBox.values.where((el) => el.buildItemKey == key).toList(); + return _mapToCustomBuildModel(build, notes, weapons, artifacts, teamCharacters); } @override @@ -58,8 +60,9 @@ class CustomBuildsDataServiceImpl implements CustomBuildsDataService { bool showOnCharacterDetail, bool isRecommended, List notes, - List weaponKeys, + List weapons, List artifacts, + List teamCharacters, List skillPriorities, ) async { final build = CustomBuild( @@ -68,7 +71,6 @@ class CustomBuildsDataServiceImpl implements CustomBuildsDataService { title, type.index, subType.index, - weaponKeys, skillPriorities.map((e) => e.index).toList(), isRecommended, ); @@ -76,8 +78,10 @@ class CustomBuildsDataServiceImpl implements CustomBuildsDataService { final buildKey = build.key as int; final buildNotes = await _saveNotes(buildKey, notes); + final buildWeapons = await _saveWeapons(buildKey, weapons); final buildArtifacts = await _saveArtifacts(buildKey, artifacts); - return _mapToCustomBuildModel(build, buildNotes, buildArtifacts); + final buildTeamCharacters = await _saveTeamCharacters(buildKey, teamCharacters); + return _mapToCustomBuildModel(build, buildNotes, buildWeapons, buildArtifacts, buildTeamCharacters); } @override @@ -89,8 +93,9 @@ class CustomBuildsDataServiceImpl implements CustomBuildsDataService { bool showOnCharacterDetail, bool isRecommended, List notes, - List weaponKeys, + List weapons, List artifacts, + List teamCharacters, List skillPriorities, ) async { final build = _buildsBox.get(key)!; @@ -98,20 +103,23 @@ class CustomBuildsDataServiceImpl implements CustomBuildsDataService { build.roleType = type.index; build.roleSubType = subType.index; build.showOnCharacterDetail = showOnCharacterDetail; - build.weaponKeys = weaponKeys; build.skillPriorities = skillPriorities.map((e) => e.index).toList(); build.isRecommended = isRecommended; await build.save(); await Future.wait([ + _deleteWeapons(key), _deleteArtifacts(key), _deleteNotes(key), + _deleteTeamCharacters(key), ]); final buildNotes = await _saveNotes(key, notes); + final buildWeapons = await _saveWeapons(key, weapons); final buildArtifacts = await _saveArtifacts(key, artifacts); - return _mapToCustomBuildModel(build, buildNotes, buildArtifacts); + final buildTeamCharacters = await _saveTeamCharacters(key, teamCharacters); + return _mapToCustomBuildModel(build, buildNotes, buildWeapons, buildArtifacts, buildTeamCharacters); } @override @@ -129,29 +137,60 @@ class CustomBuildsDataServiceImpl implements CustomBuildsDataService { return buildNotes; } + Future> _saveWeapons(int buildKey, List weapons) async { + final buildWeapons = weapons.map((e) => CustomBuildWeapon(buildKey, e.key, e.index, e.refinement)).toList(); + await _weaponsBox.addAll(buildWeapons); + return buildWeapons; + } + Future> _saveArtifacts(int buildKey, List artifacts) async { final buildArtifacts = artifacts.map((e) => CustomBuildArtifact(buildKey, e.key, e.type, e.statType, e.subStats)).toList(); await _artifactsBox.addAll(buildArtifacts); return buildArtifacts; } + Future> _saveTeamCharacters(int buildKey, List teamCharacters) async { + final buildTeamCharacters = teamCharacters.map((e) => CustomBuildTeamCharacter(buildKey, e.index, e.key, e.roleType, e.subType)).toList(); + await _teamCharactersBox.addAll(buildTeamCharacters); + return buildTeamCharacters; + } + Future _deleteNotes(int buildKey) async { - final noteKeys = _notesBox.values.where((el) => el.buildItemKey == buildKey).map((e) => e.key as int).toList(); - if (noteKeys.isNotEmpty) { - await _notesBox.deleteAll(noteKeys); + final keys = _notesBox.values.where((el) => el.buildItemKey == buildKey).map((e) => e.key as int).toList(); + if (keys.isNotEmpty) { + await _notesBox.deleteAll(keys); + } + } + + Future _deleteWeapons(int buildKey) async { + final keys = _weaponsBox.values.where((el) => el.buildItemKey == buildKey).map((e) => e.key as int).toList(); + if (keys.isNotEmpty) { + await _weaponsBox.deleteAll(keys); } } Future _deleteArtifacts(int buildKey) async { - final artifactsKeys = _artifactsBox.values.where((el) => el.buildItemKey == buildKey).map((e) => e.key as int).toList(); - if (artifactsKeys.isNotEmpty) { - await _artifactsBox.deleteAll(artifactsKeys); + final keys = _artifactsBox.values.where((el) => el.buildItemKey == buildKey).map((e) => e.key as int).toList(); + if (keys.isNotEmpty) { + await _artifactsBox.deleteAll(keys); + } + } + + Future _deleteTeamCharacters(int buildKey) async { + final keys = _teamCharactersBox.values.where((el) => el.buildItemKey == buildKey).map((e) => e.key as int).toList(); + if (keys.isNotEmpty) { + await _teamCharactersBox.deleteAll(keys); } } - CustomBuildModel _mapToCustomBuildModel(CustomBuild build, List notes, List artifacts) { + CustomBuildModel _mapToCustomBuildModel( + CustomBuild build, + List notes, + List weapons, + List artifacts, + List teamCharacters, + ) { final character = _genshinService.getCharacterForCard(build.characterKey); - final weapons = build.weaponKeys.map((e) => _genshinService.getWeaponForCard(e)).toList(); // final artifacts = build.artifactKeys.map((e) => _genshinService.getArtifactForCard(e)).toList(); return CustomBuildModel( key: build.key as int, @@ -161,11 +200,36 @@ class CustomBuildsDataServiceImpl implements CustomBuildsDataService { showOnCharacterDetail: build.showOnCharacterDetail, isRecommended: build.isRecommended, character: character, - weapons: weapons, + weapons: weapons.map((e) { + final weapon = _genshinService.getWeaponForCard(e.weaponKey); + return CustomBuildWeaponModel( + key: e.weaponKey, + index: e.index, + refinement: e.refinement, + name: weapon.name, + image: weapon.image, + rarity: weapon.rarity, + baseAtk: weapon.baseAtk, + subStatType: weapon.subStatType, + subStatValue: weapon.subStatValue, + ); + }).toList(), //TODO: THIS artifacts: [], skillPriorities: build.skillPriorities.map((e) => CharacterSkillType.values[e]).toList(), notes: notes.map((e) => CustomBuildNoteModel(index: e.index, note: e.note)).toList()..sort((x, y) => x.index.compareTo(y.index)), + teamCharacters: teamCharacters.map((e) { + final char = _genshinService.getCharacterForCard(e.characterKey); + return CustomBuildTeamCharacterModel( + key: e.characterKey, + index: e.index, + name: char.name, + image: char.image, + roleType: e.roleType, + subType: e.subType, + ); + }).toList() + ..sort((x, y) => x.index.compareTo(y.index)), ); } }