diff --git a/lib/data/db/hive/hive_data_adapter.dart b/lib/data/db/hive/hive_data_adapter.dart index 95eff5a..9a79612 100644 --- a/lib/data/db/hive/hive_data_adapter.dart +++ b/lib/data/db/hive/hive_data_adapter.dart @@ -10,6 +10,7 @@ import 'package:odyssey_mobile/data/db/hive/models/info.dart'; import 'package:odyssey_mobile/data/db/hive/models/info_group.dart'; import 'package:odyssey_mobile/data/db/hive/models/performance.dart'; import 'package:odyssey_mobile/data/db/hive/models/performance_group.dart'; +import 'package:odyssey_mobile/data/db/hive/models/sponsor.dart'; import 'package:odyssey_mobile/data/db/hive/models/stage.dart'; import 'package:odyssey_mobile/data/other/divisions.dart'; @@ -17,49 +18,53 @@ import '../../api/models/sponsor.dart'; // Adapt for multiple cities abstract class HiveDataAdapter { - static List convertCityData({ - required List cityModels, - required List infoModels, - required List infoCategories, - required List performanceModels, - required List stageModels, - required List problemModels, - required List previousFavIds, - required Box performanceBox, - required List> sponsors - }) { + static List convertCityData( + {required List cityModels, + required List infoModels, + required List infoCategories, + required List performanceModels, + required List stageModels, + required List problemModels, + required List previousFavIds, + required Box performanceBox, + required List> sponsors}) { final List citiesDb = []; for (final city in cityModels) { citiesDb.add(CityDataHiveModel( - cityId: city.id, - cityName: city.name, - infoGroups: _convertInfoCategories(infoCategories, infoModels), - performanceGroups: convertPerformanceGroups( - performances: performanceModels, - problems: problemModels, - stages: stageModels, - previousFavIds: previousFavIds, - performanceBox: performanceBox), - stages: convertStages(stageModels), - sponsors: sponsors - )); + cityId: city.id, + cityName: city.name, + infoGroups: _convertInfoCategories(infoCategories, infoModels), + performanceGroups: convertPerformanceGroups( + performances: performanceModels, + problems: problemModels, + stages: stageModels, + previousFavIds: previousFavIds, + performanceBox: performanceBox), + stages: convertStages(stageModels), + sponsorModel: convertSponsors(sponsors))); } return citiesDb; } static List _convertInfoCategories( - List infoCategoryModels, List infoModels) { + List infoCategoryModels, + List infoModels) { final List infoGroups = []; for (final infoCategory in infoCategoryModels) { - infoGroups.add(InfoGroupHiveModel(infoCategory.id, infoCategory.name, - _convertInfo(infoModels.where((e) => e.category == infoCategory.id)))); + infoGroups.add(InfoGroupHiveModel( + infoCategory.id, + infoCategory.name, + _convertInfo( + infoModels.where((e) => e.category == infoCategory.id)))); } return infoGroups; } - static List _convertInfo(Iterable apiModels) => apiModels - .map((e) => InfoHiveModel(e.category, e.infoName, e.infoText, e.sortNumber)) - .toList(); + static List _convertInfo(Iterable apiModels) => + apiModels + .map((e) => + InfoHiveModel(e.category, e.infoName, e.infoText, e.sortNumber)) + .toList(); static List convertStages(List apiModels) => apiModels.map((e) => StageHiveModel(e.name, e.number)).toList(); @@ -99,8 +104,8 @@ abstract class HiveDataAdapter { part: part, league: league, day: day, - performancesHiveList: - HiveList(performanceBox, objects: filteredPerformances.toList()))); + performancesHiveList: HiveList(performanceBox, + objects: filteredPerformances.toList()))); ++groupId; } } @@ -127,4 +132,17 @@ abstract class HiveDataAdapter { stage: e.stage, team: e.team, isFavourite: previousFavIds.contains(e.id))); + + static List convertSponsors( + List> sponsors) { + List sponsorsModelDbList = []; + + for (List sponsorListApi in sponsors) { + for (SponsorModelApi s in sponsorListApi) { + sponsorsModelDbList.add(SponsorHiveModel(s.id, s.row, s.column)); + } + } + + return sponsorsModelDbList; + } } diff --git a/lib/data/db/hive/hive_service.dart b/lib/data/db/hive/hive_service.dart index 2fc7467..eab57a7 100644 --- a/lib/data/db/hive/hive_service.dart +++ b/lib/data/db/hive/hive_service.dart @@ -15,6 +15,7 @@ import 'package:odyssey_mobile/data/db/hive/models/info_group.dart'; import 'package:odyssey_mobile/data/db/hive/models/performance.dart'; import 'package:odyssey_mobile/data/db/hive/models/performance_group.dart'; import 'package:odyssey_mobile/data/db/hive/models/problem.dart'; +import 'package:odyssey_mobile/data/db/hive/models/sponsor.dart'; import 'package:odyssey_mobile/data/db/hive/models/stage.dart'; import 'package:odyssey_mobile/domain/entities/performance.dart'; import 'package:odyssey_mobile/domain/entities/schedule_category_entity.dart'; @@ -37,6 +38,7 @@ class HiveDbService extends DbService { Hive.registerAdapter(PerformanceHiveModelAdapter()); Hive.registerAdapter(ProblemHiveModelAdapter()); Hive.registerAdapter(StageHiveModelAdapter()); + Hive.registerAdapter(SponsorHiveModelAdapter()); await Hive.initFlutter(); _box = await Hive.openBox('finalsBox', compactionStrategy: (entries, deletedEntries) { diff --git a/lib/data/db/hive/models/city_data.dart b/lib/data/db/hive/models/city_data.dart index 5a539eb..5fac263 100644 --- a/lib/data/db/hive/models/city_data.dart +++ b/lib/data/db/hive/models/city_data.dart @@ -1,6 +1,7 @@ import 'package:hive_flutter/hive_flutter.dart'; import 'package:odyssey_mobile/data/db/hive/models/info_group.dart'; import 'package:odyssey_mobile/data/db/hive/models/performance_group.dart'; +import 'package:odyssey_mobile/data/db/hive/models/sponsor.dart'; import 'package:odyssey_mobile/data/db/hive/models/stage.dart'; import 'package:odyssey_mobile/domain/entities/city_data.dart'; @@ -17,7 +18,7 @@ class CityDataHiveModel extends CityData with HiveObjectMixin { required this.infoGroups, required this.performanceGroups, required this.stages, - required this.sponsors, + required this.sponsorModel, }); @override @@ -41,6 +42,30 @@ class CityDataHiveModel extends CityData with HiveObjectMixin { final List stages; @HiveField(5) + final List sponsorModel; + @override - final List> sponsors; + get sponsors => getSponsors(); + + List> getSponsors() { + final Map> groupedByRow = {}; + + for (final sponsorModelDb in sponsorModel.toList()) { + final row = sponsorModelDb.row; + groupedByRow.putIfAbsent(row, () => []).add(sponsorModelDb); + } + + return groupedByRow.entries.map((entry) { + final sortedByColumn = entry.value + ..sort((a, b) => a.column.compareTo(b.column)); + return sortedByColumn + .map((sponsorModelDb) => SponsorModelApi( + id: sponsorModelDb.id, + row: sponsorModelDb.row, + column: sponsorModelDb.column, + )) + .toList(); + }).toList() + ..sort((a, b) => a[0].row.compareTo(b[0].row)); + } } diff --git a/lib/data/db/hive/models/city_data.g.dart b/lib/data/db/hive/models/city_data.g.dart index abe6544..79cd28f 100644 --- a/lib/data/db/hive/models/city_data.g.dart +++ b/lib/data/db/hive/models/city_data.g.dart @@ -22,9 +22,7 @@ class CityDataHiveModelAdapter extends TypeAdapter { infoGroups: (fields[2] as List).cast(), performanceGroups: (fields[3] as List).cast(), stages: (fields[4] as List).cast(), - sponsors: (fields[5] as List) - .map((dynamic e) => (e as List).cast()) - .toList(), + sponsorModel: (fields[5] as List).cast(), ); } @@ -43,7 +41,7 @@ class CityDataHiveModelAdapter extends TypeAdapter { ..writeByte(4) ..write(obj.stages) ..writeByte(5) - ..write(obj.sponsors); + ..write(obj.sponsorModel); } @override diff --git a/lib/data/db/hive/models/sponsor.dart b/lib/data/db/hive/models/sponsor.dart new file mode 100644 index 0000000..e0a976e --- /dev/null +++ b/lib/data/db/hive/models/sponsor.dart @@ -0,0 +1,15 @@ +import 'package:hive_flutter/hive_flutter.dart'; + +part 'sponsor.g.dart'; + +@HiveType(typeId: 7) +class SponsorHiveModel { + @HiveField(0) + final int id; + @HiveField(1) + final int row; + @HiveField(2) + final int column; + + SponsorHiveModel(this.id, this.row, this.column); +} diff --git a/lib/data/db/hive/models/sponsor.g.dart b/lib/data/db/hive/models/sponsor.g.dart new file mode 100644 index 0000000..50bfdf6 --- /dev/null +++ b/lib/data/db/hive/models/sponsor.g.dart @@ -0,0 +1,47 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'sponsor.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class SponsorHiveModelAdapter extends TypeAdapter { + @override + final int typeId = 7; + + @override + SponsorHiveModel read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return SponsorHiveModel( + fields[0] as int, + fields[1] as int, + fields[2] as int, + ); + } + + @override + void write(BinaryWriter writer, SponsorHiveModel obj) { + writer + ..writeByte(3) + ..writeByte(0) + ..write(obj.id) + ..writeByte(1) + ..write(obj.row) + ..writeByte(2) + ..write(obj.column); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is SponsorHiveModelAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/domain/entities/sponsor.dart b/lib/domain/entities/sponsor.dart new file mode 100644 index 0000000..af95d46 --- /dev/null +++ b/lib/domain/entities/sponsor.dart @@ -0,0 +1,6 @@ +abstract class SponsorEntity { + + int get id; + int get row; + int get column; +} \ No newline at end of file