use crate::{
common::{deserialize_ms, deserialize_opt_ms, serialize_ms, serialize_opt_ms},
events::{App, Browser, VerificationReason, VerificationType, VerifiedEvent},
};
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use std::fmt;
use std::time::{Duration, SystemTime};
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)]
pub struct SendRequest {
#[serde(rename = "$user_id")]
pub user_id: String,
#[serde(rename = "$send_to")]
pub send_to: String,
#[serde(rename = "$verification_type")]
pub verification_type: VerificationType,
#[serde(rename = "$brand_name")]
pub brand_name: Option<String>,
#[serde(rename = "$site_country")]
pub site_country: Option<String>,
#[serde(rename = "$event")]
pub event: SendRequestEvent,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)]
pub struct ResendRequest {
#[serde(rename = "$user_id")]
pub user_id: String,
#[serde(rename = "$verified_event")]
pub verified_event: Option<VerifiedEvent>,
#[serde(rename = "$verified_entity_id")]
pub verified_entity_id: Option<String>,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)]
pub struct SendRequestEvent {
#[serde(rename = "$session_id")]
pub session_id: String,
#[serde(rename = "$verified_event")]
pub verified_event: VerifiedEvent,
#[serde(rename = "$verified_entity_id")]
pub verified_entity_id: Option<String>,
#[serde(rename = "$ip")]
pub ip: Option<String>,
#[serde(rename = "$reason")]
pub reason: Option<VerificationReason>,
#[serde(rename = "$browser")]
pub browser: Option<Browser>,
#[serde(rename = "$app")]
pub app: Option<App>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SendResponse {
pub status: i32,
pub error_message: String,
#[serde(
deserialize_with = "deserialize_opt_ms",
serialize_with = "serialize_opt_ms"
)]
pub sent_at: Option<SystemTime>,
pub brand_name: Option<String>,
pub site_country: Option<String>,
pub content_language: Option<String>,
pub segment_id: Option<String>,
pub segment_name: Option<String>,
}
#[derive(Debug, Default)]
pub struct CheckOptions {
pub verified_event: Option<VerifiedEvent>,
pub verified_entity_id: Option<String>,
pub timeout: Option<Duration>,
pub version: Option<ApiVersion>,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)]
pub(crate) struct CheckRequest {
#[serde(rename = "$user_id")]
pub(crate) user_id: String,
#[serde(rename = "$code")]
pub(crate) code: String,
#[serde(rename = "$verified_event")]
pub(crate) verified_event: Option<VerifiedEvent>,
#[serde(rename = "$verified_entity_id")]
pub(crate) verified_entity_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CheckResponse {
pub status: i32,
pub error_message: String,
#[serde(deserialize_with = "deserialize_ms", serialize_with = "serialize_ms")]
pub checked_at: SystemTime,
}
#[derive(Copy, Clone, Debug)]
pub enum ApiVersion {
V1,
}
impl fmt::Display for ApiVersion {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ApiVersion::V1 => write!(f, "v1"),
}
}
}