use serde::{Deserialize, Serialize};
use crate::client::{get_owner, Client, PostBody, Response};
use crate::error::Result;
use crate::serde_util::null_to_default;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", default)]
pub struct Order {
pub owner: String,
pub name: String,
pub created_time: String,
pub update_time: String,
pub display_name: String,
#[serde(deserialize_with = "null_to_default")]
pub products: Vec<String>,
#[serde(deserialize_with = "null_to_default")]
pub product_infos: Vec<ProductInfo>,
pub user: String,
pub payment: String,
pub price: f64,
pub currency: String,
pub state: String,
pub message: String,
pub coupon_name: String,
pub coupon_discount: f64,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", default)]
pub struct ProductInfo {
pub owner: String,
pub name: String,
pub created_time: String,
pub display_name: String,
pub image: String,
pub detail: String,
pub price: f64,
pub currency: String,
pub is_recharge: bool,
pub quantity: i32,
pub pricing_name: String,
pub plan_name: String,
}
impl Order {
pub fn get_id(&self) -> String {
format!("{}/{}", self.owner, self.name)
}
}
impl Client {
pub async fn get_orders(&self) -> Result<Vec<Order>> {
self.get_list("get-orders", &[("owner", &self.config.organization_name)])
.await
}
pub async fn get_pagination_orders(
&self,
p: i32,
page_size: i32,
query: &[(&str, &str)],
) -> Result<(Vec<Order>, i32)> {
self.get_pagination(
"get-orders",
&self.config.organization_name,
p,
page_size,
query,
)
.await
}
pub async fn get_user_orders(&self, user_name: &str) -> Result<Vec<Order>> {
self.get_list(
"get-user-orders",
&[
("owner", &self.config.organization_name),
("user", user_name),
],
)
.await
}
pub async fn get_order(&self, name: &str) -> Result<Option<Order>> {
self.get_object("get-order", &[("id", &self.get_id(name))])
.await
}
pub async fn add_order(&self, order: &Order) -> Result<bool> {
Ok(self.modify_order("add-order", order, &[]).await?.1)
}
pub async fn update_order(&self, order: &Order) -> Result<bool> {
Ok(self.modify_order("update-order", order, &[]).await?.1)
}
pub async fn delete_order(&self, order: &Order) -> Result<bool> {
Ok(self.modify_order("delete-order", order, &[]).await?.1)
}
pub async fn cancel_order(&self, name: &str) -> Result<bool> {
let response = self
.do_post(
"cancel-order",
&[("id", &self.get_id(name))],
PostBody::Raw(Vec::new()),
)
.await?;
Ok(response.data.as_str() == Some("Affected"))
}
async fn modify_order(
&self,
action: &str,
order: &Order,
columns: &[&str],
) -> Result<(Response, bool)> {
let mut order = order.clone();
order.owner = get_owner(&order.owner, &self.config.organization_name);
let id = format!("{}/{}", order.owner, order.name);
self.modify_object(action, &id, &order, columns).await
}
}