use serde::{Deserialize, Serialize};
use sqlx::types::chrono::Utc;
use sqlx::FromRow;
use sqlx::Type;
use sqlx_crud::SqlxCrud;
use std::fmt;
use std::str::FromStr;
use uuid::Uuid;
#[derive(Debug, Deserialize, Serialize, Type, Clone, PartialEq, Eq)]
pub enum Status {
Pending,
InProgress,
SellerRefunded,
Settled,
Released,
}
impl fmt::Display for Status {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{self:?}")
}
}
impl FromStr for Status {
type Err = ();
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
match s {
"Pending" => std::result::Result::Ok(Self::Pending),
"InProgress" => std::result::Result::Ok(Self::InProgress),
"SellerRefunded" => std::result::Result::Ok(Self::SellerRefunded),
"Settled" => std::result::Result::Ok(Self::Settled),
"Released" => std::result::Result::Ok(Self::Released),
_ => Err(()),
}
}
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, FromRow, SqlxCrud)]
pub struct Dispute {
pub id: Uuid,
pub order_id: Uuid,
pub status: Status,
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::Pending,
solver_pubkey: None,
created_at: Utc::now().timestamp(),
taken_at: 0,
}
}
}