use chrono::Utc;
use serde::{Deserialize, Serialize};
#[cfg(feature = "sqlx")]
use sqlx::{FromRow, Type};
#[cfg(feature = "sqlx")]
use sqlx_crud::SqlxCrud;
use std::{fmt::Display, str::FromStr};
use uuid::Uuid;
#[cfg_attr(feature = "sqlx", derive(Type))]
#[derive(Debug, Default, Deserialize, Serialize, Clone, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub enum Status {
#[default]
Initiated,
InProgress,
SellerRefunded,
Settled,
Released,
}
impl Display for Status {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Status::Initiated => write!(f, "initiated"),
Status::InProgress => write!(f, "in-progress"),
Status::SellerRefunded => write!(f, "seller-refunded"),
Status::Settled => write!(f, "settled"),
Status::Released => write!(f, "released"),
}
}
}
impl FromStr for Status {
type Err = ();
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
match s {
"initiated" => std::result::Result::Ok(Self::Initiated),
"in-progress" => std::result::Result::Ok(Self::InProgress),
"seller-refunded" => std::result::Result::Ok(Self::SellerRefunded),
"settled" => std::result::Result::Ok(Self::Settled),
"released" => std::result::Result::Ok(Self::Released),
_ => Err(()),
}
}
}
#[cfg_attr(feature = "sqlx", derive(FromRow, SqlxCrud), external_id)]
#[derive(Debug, Default, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct Dispute {
pub id: Uuid,
pub order_id: Uuid,
pub status: String,
pub solver_pubkey: Option<String>,
pub created_at: i64,
pub taken_at: i64,
}
impl Dispute {
pub fn new(order_id: Uuid) -> Self {
Self {
id: Uuid::new_v4(),
order_id,
status: Status::Initiated.to_string(),
solver_pubkey: None,
created_at: Utc::now().timestamp(),
taken_at: 0,
}
}
}