update database

This commit is contained in:
Phuoc Nguyen
2025-10-24 11:31:48 +07:00
parent f95fa9d0a6
commit c4272f9a21
126 changed files with 23528 additions and 2234 deletions

View File

@@ -0,0 +1,56 @@
import 'dart:convert';
import 'package:hive_ce/hive.dart';
import 'package:worker/core/constants/storage_constants.dart';
part 'notification_model.g.dart';
@HiveType(typeId: HiveTypeIds.notificationModel)
class NotificationModel extends HiveObject {
NotificationModel({required this.notificationId, required this.userId, required this.type, required this.title, required this.message, this.data, required this.isRead, required this.isPushed, required this.createdAt, this.readAt});
@HiveField(0) final String notificationId;
@HiveField(1) final String userId;
@HiveField(2) final String type;
@HiveField(3) final String title;
@HiveField(4) final String message;
@HiveField(5) final String? data;
@HiveField(6) final bool isRead;
@HiveField(7) final bool isPushed;
@HiveField(8) final DateTime createdAt;
@HiveField(9) final DateTime? readAt;
factory NotificationModel.fromJson(Map<String, dynamic> json) => NotificationModel(
notificationId: json['notification_id'] as String,
userId: json['user_id'] as String,
type: json['type'] as String,
title: json['title'] as String,
message: json['message'] as String,
data: json['data'] != null ? jsonEncode(json['data']) : null,
isRead: json['is_read'] as bool? ?? false,
isPushed: json['is_pushed'] as bool? ?? false,
createdAt: DateTime.parse(json['created_at']?.toString() ?? ''),
readAt: json['read_at'] != null ? DateTime.parse(json['read_at']?.toString() ?? '') : null,
);
Map<String, dynamic> toJson() => {
'notification_id': notificationId,
'user_id': userId,
'type': type,
'title': title,
'message': message,
'data': data != null ? jsonDecode(data!) : null,
'is_read': isRead,
'is_pushed': isPushed,
'created_at': createdAt.toIso8601String(),
'read_at': readAt?.toIso8601String(),
};
Map<String, dynamic>? get dataMap {
if (data == null) return null;
try {
return jsonDecode(data!) as Map<String, dynamic>;
} catch (e) {
return null;
}
}
}

View File

@@ -0,0 +1,68 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'notification_model.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class NotificationModelAdapter extends TypeAdapter<NotificationModel> {
@override
final typeId = 20;
@override
NotificationModel read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return NotificationModel(
notificationId: fields[0] as String,
userId: fields[1] as String,
type: fields[2] as String,
title: fields[3] as String,
message: fields[4] as String,
data: fields[5] as String?,
isRead: fields[6] as bool,
isPushed: fields[7] as bool,
createdAt: fields[8] as DateTime,
readAt: fields[9] as DateTime?,
);
}
@override
void write(BinaryWriter writer, NotificationModel obj) {
writer
..writeByte(10)
..writeByte(0)
..write(obj.notificationId)
..writeByte(1)
..write(obj.userId)
..writeByte(2)
..write(obj.type)
..writeByte(3)
..write(obj.title)
..writeByte(4)
..write(obj.message)
..writeByte(5)
..write(obj.data)
..writeByte(6)
..write(obj.isRead)
..writeByte(7)
..write(obj.isPushed)
..writeByte(8)
..write(obj.createdAt)
..writeByte(9)
..write(obj.readAt);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is NotificationModelAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -0,0 +1,162 @@
/// Domain Entity: Notification
///
/// Represents a notification sent to a user.
library;
/// Notification Entity
///
/// Contains information about a notification:
/// - Notification type and content
/// - Associated data
/// - Read and push status
class Notification {
/// Unique notification identifier
final String notificationId;
/// User ID receiving the notification
final String userId;
/// Notification type (order, loyalty, promotion, system, etc.)
final String type;
/// Notification title
final String title;
/// Notification message/body
final String message;
/// Additional data (JSON object with context-specific information)
final Map<String, dynamic>? data;
/// Notification has been read
final bool isRead;
/// Push notification has been sent
final bool isPushed;
/// Notification creation timestamp
final DateTime createdAt;
/// Read timestamp
final DateTime? readAt;
const Notification({
required this.notificationId,
required this.userId,
required this.type,
required this.title,
required this.message,
this.data,
required this.isRead,
required this.isPushed,
required this.createdAt,
this.readAt,
});
/// Check if notification is unread
bool get isUnread => !isRead;
/// Check if notification is order-related
bool get isOrderNotification => type.toLowerCase().contains('order');
/// Check if notification is loyalty-related
bool get isLoyaltyNotification => type.toLowerCase().contains('loyalty') ||
type.toLowerCase().contains('points');
/// Check if notification is promotion-related
bool get isPromotionNotification =>
type.toLowerCase().contains('promotion') ||
type.toLowerCase().contains('discount');
/// Check if notification is system-related
bool get isSystemNotification => type.toLowerCase().contains('system');
/// Get related entity ID from data
String? get relatedEntityId {
if (data == null) return null;
return data!['entity_id'] as String? ??
data!['order_id'] as String? ??
data!['quote_id'] as String?;
}
/// Get related entity type from data
String? get relatedEntityType {
if (data == null) return null;
return data!['entity_type'] as String?;
}
/// Get time since notification was created
Duration get timeSinceCreated {
return DateTime.now().difference(createdAt);
}
/// Check if notification is recent (less than 24 hours)
bool get isRecent {
return timeSinceCreated.inHours < 24;
}
/// Check if notification is old (more than 7 days)
bool get isOld {
return timeSinceCreated.inDays > 7;
}
/// Copy with method for immutability
Notification copyWith({
String? notificationId,
String? userId,
String? type,
String? title,
String? message,
Map<String, dynamic>? data,
bool? isRead,
bool? isPushed,
DateTime? createdAt,
DateTime? readAt,
}) {
return Notification(
notificationId: notificationId ?? this.notificationId,
userId: userId ?? this.userId,
type: type ?? this.type,
title: title ?? this.title,
message: message ?? this.message,
data: data ?? this.data,
isRead: isRead ?? this.isRead,
isPushed: isPushed ?? this.isPushed,
createdAt: createdAt ?? this.createdAt,
readAt: readAt ?? this.readAt,
);
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is Notification &&
other.notificationId == notificationId &&
other.userId == userId &&
other.type == type &&
other.title == title &&
other.message == message &&
other.isRead == isRead &&
other.isPushed == isPushed;
}
@override
int get hashCode {
return Object.hash(
notificationId,
userId,
type,
title,
message,
isRead,
isPushed,
);
}
@override
String toString() {
return 'Notification(notificationId: $notificationId, type: $type, '
'title: $title, isRead: $isRead, createdAt: $createdAt)';
}
}