//! Content insertion and placement models. use chrono::{DateTime, Utc}; use serde::Serialize; use sqlx::FromRow; use super::super::id_types::*; /// A reusable insertion clip (intro, outro, sponsor read) owned by a creator. #[derive(Debug, Clone, FromRow, Serialize)] pub struct DbContentInsertion { pub id: ContentInsertionId, pub user_id: UserId, pub title: String, pub media_type: String, pub storage_key: String, pub duration_ms: i32, pub file_size: i64, pub mime_type: String, pub created_at: DateTime, } /// A placement of an insertion clip on a specific item. #[derive(Debug, Clone, FromRow)] pub struct DbInsertionPlacement { pub id: ContentInsertionPlacementId, pub item_id: ItemId, pub insertion_id: ContentInsertionId, pub position: super::super::InsertionPosition, pub offset_ms: Option, pub sort_order: i32, pub created_at: DateTime, } /// A placement joined with its insertion data, for building the player segment list. #[derive(Debug, Clone, FromRow)] pub struct DbPlacementWithInsertion { pub id: ContentInsertionPlacementId, pub item_id: ItemId, pub insertion_id: ContentInsertionId, pub position: super::super::InsertionPosition, pub offset_ms: Option, pub sort_order: i32, pub created_at: DateTime, /// Joined from content_insertions. pub insertion_title: String, /// Joined from content_insertions. pub insertion_duration_ms: i32, /// Joined from content_insertions. pub insertion_storage_key: String, }