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:
parent
8acb8db7d7
commit
3efdd97057
@ -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(),
|
||||
|
||||
Loading…
Reference in New Issue
Block a user