use crate::internal::domain::{AccountId, LocalUserId, OrderPreviewId};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use uuid::Uuid;
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct ApprovalId(Uuid);
impl ApprovalId {
#[must_use]
pub fn new() -> Self {
Self(Uuid::now_v7())
}
#[must_use]
pub const fn from_uuid(value: Uuid) -> Self {
Self(value)
}
pub fn parse(value: &str) -> Result<Self, crate::internal::domain::GatewayError> {
let uuid = Uuid::parse_str(value).map_err(|_| {
crate::internal::domain::GatewayError::new(
crate::internal::domain::ErrorCode::OrderValidationFailed,
"Approval id must be a valid UUID",
false,
Some("Use an approval_id returned by approvals create".to_string()),
)
})?;
Ok(Self(uuid))
}
#[must_use]
pub const fn as_uuid(&self) -> Uuid {
self.0
}
}
impl Default for ApprovalId {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ApprovalStatus {
Pending,
Approved,
Consumed,
Expired,
Revoked,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ApprovalRecord {
pub approval_id: ApprovalId,
pub preview_id: OrderPreviewId,
pub account_id: AccountId,
pub approved_by: LocalUserId,
pub status: ApprovalStatus,
#[serde(with = "time::serde::rfc3339::option")]
#[schemars(with = "Option<String>")]
pub approved_at: Option<OffsetDateTime>,
#[serde(with = "time::serde::rfc3339")]
#[schemars(with = "String")]
pub expires_at: OffsetDateTime,
}