use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use cloudillo_core::prelude::*;
use cloudillo_types::types::serialize_timestamp_iso;
#[skip_serializing_none]
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ContactName {
pub given: Option<String>,
pub family: Option<String>,
pub additional: Option<String>,
pub prefix: Option<String>,
pub suffix: Option<String>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TypedValue {
pub value: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub r#type: Vec<String>,
pub pref: Option<u8>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ProfileOverlay {
pub id_tag: String,
pub name: Option<String>,
pub r#type: Option<String>,
pub profile_pic: Option<String>,
pub status: Option<cloudillo_types::meta_adapter::ProfileStatus>,
pub connected: Option<bool>,
pub following: Option<bool>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ContactInput {
pub uid: Option<String>,
#[serde(rename = "fn")]
pub formatted_name: Option<String>,
pub n: Option<ContactName>,
#[serde(default)]
pub emails: Vec<TypedValue>,
#[serde(default)]
pub phones: Vec<TypedValue>,
pub org: Option<String>,
pub title: Option<String>,
pub note: Option<String>,
pub photo: Option<String>,
pub profile_id_tag: Option<String>,
}
#[derive(Debug, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ContactPatch {
#[serde(default, rename = "fn")]
pub formatted_name: Patch<String>,
#[serde(default)]
pub n: Patch<ContactName>,
#[serde(default)]
pub emails: Patch<Vec<TypedValue>>,
#[serde(default)]
pub phones: Patch<Vec<TypedValue>>,
#[serde(default)]
pub org: Patch<String>,
#[serde(default)]
pub title: Patch<String>,
#[serde(default)]
pub note: Patch<String>,
#[serde(default)]
pub photo: Patch<String>,
#[serde(default)]
pub profile_id_tag: Patch<String>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ContactOutput {
pub c_id: u64,
pub ab_id: u64,
pub uid: String,
pub etag: String,
#[serde(rename = "fn")]
pub formatted_name: Option<String>,
pub n: Option<ContactName>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub emails: Vec<TypedValue>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub phones: Vec<TypedValue>,
pub org: Option<String>,
pub title: Option<String>,
pub note: Option<String>,
pub photo: Option<String>,
pub profile_id_tag: Option<String>,
pub profile: Option<ProfileOverlay>,
pub parse_error: Option<String>,
#[serde(serialize_with = "serialize_timestamp_iso")]
pub created_at: Timestamp,
#[serde(serialize_with = "serialize_timestamp_iso")]
pub updated_at: Timestamp,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ContactListItem {
pub c_id: u64,
pub ab_id: u64,
pub uid: String,
pub etag: String,
#[serde(rename = "fn")]
pub formatted_name: Option<String>,
pub email: Option<String>,
pub tel: Option<String>,
pub org: Option<String>,
pub photo: Option<String>,
pub profile_id_tag: Option<String>,
pub profile: Option<ProfileOverlay>,
#[serde(serialize_with = "serialize_timestamp_iso")]
pub updated_at: Timestamp,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AddressBookOutput {
pub ab_id: u64,
pub name: String,
pub description: Option<String>,
pub ctag: String,
#[serde(serialize_with = "serialize_timestamp_iso")]
pub created_at: Timestamp,
#[serde(serialize_with = "serialize_timestamp_iso")]
pub updated_at: Timestamp,
}
#[skip_serializing_none]
#[derive(Debug, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AddressBookCreate {
pub name: String,
pub description: Option<String>,
}
#[derive(Debug, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AddressBookPatch {
#[serde(default)]
pub name: Patch<String>,
#[serde(default)]
pub description: Patch<String>,
}
#[derive(Debug, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ListContactsQuery {
pub q: Option<String>,
pub cursor: Option<String>,
pub limit: Option<u32>,
}
#[derive(Debug, Clone, Copy, Deserialize, Default, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub enum ImportConflictMode {
#[default]
Skip,
Replace,
Add,
}
#[derive(Debug, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ImportContactsQuery {
#[serde(default)]
pub conflict: Option<ImportConflictMode>,
}
#[derive(Debug, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ImportContactsError {
pub index: u32,
pub uid: Option<String>,
pub message: String,
}
#[derive(Debug, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ImportContactsResult {
pub total: u32,
pub imported: u32,
pub updated: u32,
pub skipped: u32,
pub errors: Vec<ImportContactsError>,
}