feat(broadcasts): Rich media support in backend types

- BroadcastMedia interface for image/video/gif/audio
- Extended BroadcastMetrics with media engagement tracking
- Updated CreateBroadcastSchema with media array validation
This commit is contained in:
saravanakumardb1 2026-03-03 08:36:00 -08:00
parent 8acb8db7d7
commit 3efdd97057

View File

@ -68,6 +68,9 @@ export interface Broadcast {
ctaUrl?: string;
imageUrl?: string;
// Rich Media (multiple images/videos supported)
media?: BroadcastMedia[];
// Targeting
target: BroadcastTarget;
@ -118,6 +121,19 @@ export interface BroadcastTarget {
specificUserIds?: string[];
}
// Rich Media Content
export interface BroadcastMedia {
type: 'image' | 'video' | 'gif' | 'audio';
url: string;
thumbnailUrl?: string;
width?: number;
height?: number;
duration?: number; // For video/audio in seconds
size?: number; // File size in bytes
mimeType?: string;
}
// Engagement Metrics with rich media tracking
export interface BroadcastMetrics {
targetedCount: number;
sentCount: number;
@ -126,6 +142,10 @@ export interface BroadcastMetrics {
clickedCount: number;
dismissedCount: number;
convertedCount: number;
// Rich media engagement
mediaViewedCount?: number;
mediaCompletedCount?: number;
mediaClickedCount?: number;
}
// =============================================================================
@ -172,6 +192,11 @@ export interface InAppMessage {
bodyMarkdown?: string;
ctaText?: string;
ctaUrl?: string;
// Rich Media
media?: BroadcastMedia[];
imageUrl?: string; // Legacy support
priority: 'low' | 'normal' | 'high' | 'urgent';
style: 'banner' | 'modal' | 'toast' | 'fullscreen';
dismissible: boolean;
@ -221,6 +246,16 @@ export const CreateBroadcastSchema = z.object({
ctaText: z.string().max(50).optional(),
ctaUrl: z.string().url().max(500).optional(),
imageUrl: z.string().url().optional(),
media: z.array(z.object({
type: z.enum(['image', 'video', 'gif', 'audio']),
url: z.string().url(),
thumbnailUrl: z.string().url().optional(),
width: z.number().optional(),
height: z.number().optional(),
duration: z.number().optional(),
size: z.number().optional(),
mimeType: z.string().optional(),
})).optional(),
target: BroadcastTargetSchema,
channels: z.array(z.nativeEnum(BroadcastChannel)).min(1),
scheduledAt: z.string().datetime().optional(),