3f3d613d99
- 后端: 新增 notifications/user_notifications 表迁移及 ORM 模型
- 后端: 实现 schema/repository/service/router 全套通知 API
- GET /api/v1/notifications (列表+游标分页)
- GET /api/v1/notifications/unread-count
- PATCH /api/v1/notifications/{id}/read (幂等)
- PATCH /api/v1/notifications/mark-all-read (幂等)
- 后端: payload 使用 Pydantic discriminated union (none/open_route/open_url)
- 后端: 19 个单元测试全部通过
- Flutter: 通知 feature 完整实现 (models/apis/repositories/bloc/UI)
- Flutter: Home 页通知按钮接入真实页面,显示未读 badge
- Flutter: 14 个测试全部通过
- 协议文档: notification-inbox-protocol.md 及错误码注册
40 lines
891 B
Dart
40 lines
891 B
Dart
import 'notification_payload.dart';
|
|
|
|
class NotificationItem {
|
|
const NotificationItem({
|
|
required this.id,
|
|
required this.notificationId,
|
|
required this.type,
|
|
required this.title,
|
|
required this.body,
|
|
required this.payload,
|
|
required this.isRead,
|
|
required this.createdAt,
|
|
this.readAt,
|
|
});
|
|
|
|
final String id;
|
|
final String notificationId;
|
|
final String type;
|
|
final String title;
|
|
final String body;
|
|
final NotificationPayload payload;
|
|
final bool isRead;
|
|
final DateTime createdAt;
|
|
final DateTime? readAt;
|
|
|
|
NotificationItem copyWith({bool? isRead, DateTime? readAt}) {
|
|
return NotificationItem(
|
|
id: id,
|
|
notificationId: notificationId,
|
|
type: type,
|
|
title: title,
|
|
body: body,
|
|
payload: payload,
|
|
isRead: isRead ?? this.isRead,
|
|
createdAt: createdAt,
|
|
readAt: readAt ?? this.readAt,
|
|
);
|
|
}
|
|
}
|