diff --git a/services/platform-service/src/modules/broadcasts/types.ts b/services/platform-service/src/modules/broadcasts/types.ts index a2288a7d..382c0e7d 100644 --- a/services/platform-service/src/modules/broadcasts/types.ts +++ b/services/platform-service/src/modules/broadcasts/types.ts @@ -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(),