use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use tokio_postgres::{Error, Row}; use uuid::Uuid; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Contact { pub id: Uuid, pub interviewee_id: Uuid, pub primary_origin_id: Uuid, pub contact_type: String, pub raw_value: String, pub normalized_value: String, pub relationship_kind: String, pub label: Option, pub confidence: f32, pub status: String, pub discovered_in_run_id: Option, pub first_seen_at: DateTime, pub last_seen_at: DateTime, pub last_verified_at: Option>, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct NewContact { pub interviewee_id: Uuid, pub primary_origin_id: Uuid, pub contact_type: String, pub raw_value: String, pub normalized_value: String, pub relationship_kind: String, pub label: Option, pub confidence: f32, pub discovered_in_run_id: Option, } #[derive(Debug, Clone, Default, Serialize, Deserialize)] pub struct ContactPatch { pub relationship_kind: Option, pub label: Option, pub confidence: Option, pub status: Option, } impl Contact { pub fn from_row(row: &Row) -> Result { Ok(Self { id: row.try_get("id")?, interviewee_id: row.try_get("interviewee_id")?, primary_origin_id: row.try_get("primary_origin_id")?, contact_type: row.try_get("contact_type")?, raw_value: row.try_get("raw_value")?, normalized_value: row.try_get("normalized_value")?, relationship_kind: row.try_get("relationship_kind")?, label: row.try_get("label")?, confidence: row.try_get("confidence")?, status: row.try_get("status")?, discovered_in_run_id: row.try_get("discovered_in_run_id")?, first_seen_at: row.try_get("first_seen_at")?, last_seen_at: row.try_get("last_seen_at")?, last_verified_at: row.try_get("last_verified_at")?, created_at: row.try_get("created_at")?, updated_at: row.try_get("updated_at")?, deleted_at: row.try_get("deleted_at")?, }) } }