class Bonus { int storage; String type; int validTill; bool isRevoked; Bonus(this.storage, this.type, this.validTill, this.isRevoked); factory Bonus.fromJson(Map json) { return Bonus( json['storage'], json['type'], json['validTill'], json['isRevoked'], ); } Map toJson() { return { 'storage': storage, 'type': type, 'validTill': validTill, 'isRevoked': isRevoked, }; } } class BonusData { static Set signUpBonusTypes = {'SIGN_UP', 'REFERRAL'}; final List storageBonuses; BonusData(this.storageBonuses); List getAddOnBonuses() { return storageBonuses .where((b) => !signUpBonusTypes.contains(b.type)) .toList(); } int totalAddOnBonus() { return getAddOnBonuses().fold(0, (sum, bonus) => sum + bonus.storage); } factory BonusData.fromJson(Map? json) { if (json == null || json['storageBonuses'] == null) { return BonusData([]); } return BonusData( (json['storageBonuses'] as List) .map((bonus) => Bonus.fromJson(bonus)) .toList(), ); } Map toJson() { return { 'storageBonuses': storageBonuses.map((bonus) => bonus.toJson()).toList(), }; } }