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;
|
ctaUrl?: string;
|
||||||
imageUrl?: string;
|
imageUrl?: string;
|
||||||
|
|
||||||
|
// Rich Media (multiple images/videos supported)
|
||||||
|
media?: BroadcastMedia[];
|
||||||
|
|
||||||
// Targeting
|
// Targeting
|
||||||
target: BroadcastTarget;
|
target: BroadcastTarget;
|
||||||
|
|
||||||
@ -118,6 +121,19 @@ export interface BroadcastTarget {
|
|||||||
specificUserIds?: string[];
|
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 {
|
export interface BroadcastMetrics {
|
||||||
targetedCount: number;
|
targetedCount: number;
|
||||||
sentCount: number;
|
sentCount: number;
|
||||||
@ -126,6 +142,10 @@ export interface BroadcastMetrics {
|
|||||||
clickedCount: number;
|
clickedCount: number;
|
||||||
dismissedCount: number;
|
dismissedCount: number;
|
||||||
convertedCount: number;
|
convertedCount: number;
|
||||||
|
// Rich media engagement
|
||||||
|
mediaViewedCount?: number;
|
||||||
|
mediaCompletedCount?: number;
|
||||||
|
mediaClickedCount?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
@ -172,6 +192,11 @@ export interface InAppMessage {
|
|||||||
bodyMarkdown?: string;
|
bodyMarkdown?: string;
|
||||||
ctaText?: string;
|
ctaText?: string;
|
||||||
ctaUrl?: string;
|
ctaUrl?: string;
|
||||||
|
|
||||||
|
// Rich Media
|
||||||
|
media?: BroadcastMedia[];
|
||||||
|
imageUrl?: string; // Legacy support
|
||||||
|
|
||||||
priority: 'low' | 'normal' | 'high' | 'urgent';
|
priority: 'low' | 'normal' | 'high' | 'urgent';
|
||||||
style: 'banner' | 'modal' | 'toast' | 'fullscreen';
|
style: 'banner' | 'modal' | 'toast' | 'fullscreen';
|
||||||
dismissible: boolean;
|
dismissible: boolean;
|
||||||
@ -221,6 +246,16 @@ export const CreateBroadcastSchema = z.object({
|
|||||||
ctaText: z.string().max(50).optional(),
|
ctaText: z.string().max(50).optional(),
|
||||||
ctaUrl: z.string().url().max(500).optional(),
|
ctaUrl: z.string().url().max(500).optional(),
|
||||||
imageUrl: z.string().url().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,
|
target: BroadcastTargetSchema,
|
||||||
channels: z.array(z.nativeEnum(BroadcastChannel)).min(1),
|
channels: z.array(z.nativeEnum(BroadcastChannel)).min(1),
|
||||||
scheduledAt: z.string().datetime().optional(),
|
scheduledAt: z.string().datetime().optional(),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user