use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use serde_json::Value; use tokio_postgres::{Error, Row}; use uuid::Uuid; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Interviewee { pub id: Uuid, pub primary_category_id: Option, pub display_name: String, pub real_name: Option, pub brand_name: Option, pub normalized_display_name: String, pub normalized_real_name: Option, pub normalized_brand_name: Option, pub professional_summary: String, pub public_bio: String, pub profession: Option, pub creator_content_type: Option, pub creator_audience: Option, pub professional_image_asset_id: Option, pub personal_image_asset_id: Option, pub status: String, pub dedup_review_status: String, pub created_in_run_id: Option, pub metadata: Value, pub best_email: Option, pub best_phone: Option, pub best_contacts_computed_at: Option>, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct NewInterviewee { pub primary_category_id: Option, pub display_name: String, pub real_name: Option, pub brand_name: Option, pub normalized_display_name: String, pub normalized_real_name: Option, pub normalized_brand_name: Option, #[serde(default)] pub professional_summary: String, #[serde(default)] pub public_bio: String, pub profession: Option, pub creator_content_type: Option, pub creator_audience: Option, pub professional_image_asset_id: Option, pub personal_image_asset_id: Option, pub created_in_run_id: Option, #[serde(default)] pub metadata: Value, } #[derive(Debug, Clone, Default, Serialize, Deserialize)] pub struct IntervieweePatch { pub primary_category_id: Option, pub display_name: Option, pub real_name: Option, pub brand_name: Option, pub normalized_display_name: Option, pub normalized_real_name: Option, pub normalized_brand_name: Option, pub professional_summary: Option, pub public_bio: Option, pub profession: Option, pub creator_content_type: Option, pub creator_audience: Option, pub professional_image_asset_id: Option, pub personal_image_asset_id: Option, pub status: Option, pub dedup_review_status: Option, pub metadata: Option, } impl Interviewee { pub fn from_row(row: &Row) -> Result { Ok(Self { id: row.try_get("id")?, primary_category_id: row.try_get("primary_category_id")?, display_name: row.try_get("display_name")?, real_name: row.try_get("real_name")?, brand_name: row.try_get("brand_name")?, normalized_display_name: row.try_get("normalized_display_name")?, normalized_real_name: row.try_get("normalized_real_name")?, normalized_brand_name: row.try_get("normalized_brand_name")?, professional_summary: row.try_get("professional_summary")?, public_bio: row.try_get("public_bio")?, profession: row.try_get("profession")?, creator_content_type: row.try_get("creator_content_type")?, creator_audience: row.try_get("creator_audience")?, professional_image_asset_id: row.try_get("professional_image_asset_id")?, personal_image_asset_id: row.try_get("personal_image_asset_id")?, status: row.try_get("status")?, dedup_review_status: row.try_get("dedup_review_status")?, created_in_run_id: row.try_get("created_in_run_id")?, metadata: row.try_get("metadata")?, best_email: row.try_get("best_email")?, best_phone: row.try_get("best_phone")?, best_contacts_computed_at: row.try_get("best_contacts_computed_at")?, created_at: row.try_get("created_at")?, updated_at: row.try_get("updated_at")?, deleted_at: row.try_get("deleted_at")?, }) } }