import { NotificationEntity, NotificationType, NotificationPriority, TargetType, NotificationTarget, } from '../../../domain/entities/notification.entity'; import { NotificationWithReadStatus } from '../../../domain/repositories/notification.repository'; /** * 目标配置响应 */ export interface TargetConfigResponseDto { type: TargetType; tagIds?: string[]; segmentId?: string; accountSequences?: string[]; } /** * 通知响应DTO */ export class NotificationResponseDto { id: string; title: string; content: string; type: NotificationType; priority: NotificationPriority; targetType: TargetType; targetConfig: TargetConfigResponseDto | null; imageUrl: string | null; linkUrl: string | null; isEnabled: boolean; requiresForceRead: boolean; publishedAt: string | null; expiresAt: string | null; createdAt: string; static fromEntity(entity: NotificationEntity): NotificationResponseDto { return { id: entity.id, title: entity.title, content: entity.content, type: entity.type, priority: entity.priority, targetType: entity.targetType, targetConfig: entity.targetConfig, imageUrl: entity.imageUrl, linkUrl: entity.linkUrl, isEnabled: entity.isEnabled, requiresForceRead: entity.requiresForceRead, publishedAt: entity.publishedAt?.toISOString() ?? null, expiresAt: entity.expiresAt?.toISOString() ?? null, createdAt: entity.createdAt.toISOString(), }; } } /** * 带已读状态的通知响应DTO(用于用户端) */ export class UserNotificationResponseDto { id: string; title: string; content: string; type: NotificationType; priority: NotificationPriority; imageUrl: string | null; linkUrl: string | null; publishedAt: string | null; isRead: boolean; readAt: string | null; requiresForceRead: boolean; static fromEntity(item: NotificationWithReadStatus): UserNotificationResponseDto { return { id: item.notification.id, title: item.notification.title, content: item.notification.content, type: item.notification.type, priority: item.notification.priority, imageUrl: item.notification.imageUrl, linkUrl: item.notification.linkUrl, publishedAt: item.notification.publishedAt?.toISOString() ?? null, isRead: item.isRead, readAt: item.readAt?.toISOString() ?? null, requiresForceRead: item.notification.requiresForceRead, }; } } /** * 未读数量响应 */ export class UnreadCountResponseDto { unreadCount: number; } /** * 通知列表响应 */ export class NotificationListResponseDto { notifications: UserNotificationResponseDto[]; total: number; unreadCount: number; }