Files
worker/lib/features/home/data/models/member_card_model.dart
2025-10-24 11:31:48 +07:00

186 lines
4.6 KiB
Dart

/// Data Model: Member Card
///
/// Data Transfer Object for member card information.
/// This model handles serialization/deserialization for:
/// - JSON (API responses)
/// - Hive (local database)
///
/// Extends the domain entity and adds data layer functionality.
library;
import 'package:hive_ce/hive.dart';
import 'package:worker/core/constants/storage_constants.dart';
import 'package:worker/features/home/domain/entities/member_card.dart';
part 'member_card_model.g.dart';
/// Member Card Model
///
/// Used for:
/// - API JSON serialization/deserialization
/// - Hive local database storage
/// - Converting to/from domain entity
///
/// Hive Type ID: 25 (from HiveTypeIds.memberCardModel)
@HiveType(typeId: HiveTypeIds.memberCardModel)
class MemberCardModel extends HiveObject {
/// Member ID
@HiveField(0)
final String memberId;
/// Member name
@HiveField(1)
final String name;
/// Member type (stored as string for serialization)
@HiveField(2)
final String memberType;
/// Membership tier (stored as string for serialization)
@HiveField(3)
final String tier;
/// Current points
@HiveField(4)
final int points;
/// Card expiration date (stored as ISO8601 string)
@HiveField(5)
final String validUntil;
/// QR code data
@HiveField(6)
final String qrData;
MemberCardModel({
required this.memberId,
required this.name,
required this.memberType,
required this.tier,
required this.points,
required this.validUntil,
required this.qrData,
});
/// From JSON constructor
factory MemberCardModel.fromJson(Map<String, dynamic> json) {
return MemberCardModel(
memberId: json['memberId'] as String,
name: json['name'] as String,
memberType: json['memberType'] as String,
tier: json['tier'] as String,
points: json['points'] as int,
validUntil: json['validUntil'] as String,
qrData: json['qrData'] as String,
);
}
/// To JSON method
Map<String, dynamic> toJson() {
return {
'memberId': memberId,
'name': name,
'memberType': memberType,
'tier': tier,
'points': points,
'validUntil': validUntil,
'qrData': qrData,
};
}
/// Convert to domain entity
MemberCard toEntity() {
return MemberCard(
memberId: memberId,
name: name,
memberType: _parseMemberType(memberType),
tier: _parseMemberTier(tier),
points: points,
validUntil: DateTime.parse(validUntil),
qrData: qrData,
);
}
/// Create from domain entity
factory MemberCardModel.fromEntity(MemberCard entity) {
return MemberCardModel(
memberId: entity.memberId,
name: entity.name,
memberType: entity.memberType.name,
tier: entity.tier.name,
points: entity.points,
validUntil: entity.validUntil.toIso8601String(),
qrData: entity.qrData,
);
}
/// Parse member type from string
static MemberType _parseMemberType(String type) {
return MemberType.values.firstWhere(
(e) => e.name.toLowerCase() == type.toLowerCase(),
orElse: () => MemberType.contractor, // Default fallback
);
}
/// Parse member tier from string
static MemberTier _parseMemberTier(String tier) {
return MemberTier.values.firstWhere(
(e) => e.name.toLowerCase() == tier.toLowerCase(),
orElse: () => MemberTier.gold, // Default fallback
);
}
/// Copy with method for creating modified copies
MemberCardModel copyWith({
String? memberId,
String? name,
String? memberType,
String? tier,
int? points,
String? validUntil,
String? qrData,
}) {
return MemberCardModel(
memberId: memberId ?? this.memberId,
name: name ?? this.name,
memberType: memberType ?? this.memberType,
tier: tier ?? this.tier,
points: points ?? this.points,
validUntil: validUntil ?? this.validUntil,
qrData: qrData ?? this.qrData,
);
}
@override
String toString() {
return 'MemberCardModel(memberId: $memberId, name: $name, memberType: $memberType, tier: $tier, points: $points)';
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is MemberCardModel &&
other.memberId == memberId &&
other.name == name &&
other.memberType == memberType &&
other.tier == tier &&
other.points == points &&
other.validUntil == validUntil &&
other.qrData == qrData;
}
@override
int get hashCode {
return Object.hash(
memberId,
name,
memberType,
tier,
points,
validUntil,
qrData,
);
}
}