casdoor_rust_sdk/
order_pay.rs1use serde::Serialize;
16
17use crate::client::{Client, PostBody};
18use crate::error::Result;
19use crate::order::{Order, ProductInfo};
20use crate::payment::Payment;
21
22#[derive(Serialize)]
23#[serde(rename_all = "camelCase")]
24struct PlaceOrderRequest<'a> {
25 product_infos: &'a [ProductInfo],
26}
27
28impl Client {
29 pub async fn place_order(
32 &self,
33 product_infos: &[ProductInfo],
34 user_name: &str,
35 ) -> Result<Order> {
36 let mut query = vec![("owner", self.config.organization_name.as_str())];
37 if !user_name.is_empty() {
38 query.push(("userName", user_name));
39 }
40
41 let post_bytes = serde_json::to_vec(&PlaceOrderRequest { product_infos })?;
42 let response = self
43 .do_post("place-order", &query, PostBody::Raw(post_bytes))
44 .await?;
45
46 Ok(serde_json::from_value(response.data)?)
47 }
48
49 pub async fn pay_order(&self, order_name: &str, provider_name: &str) -> Result<Payment> {
52 let response = self
53 .do_post(
54 "pay-order",
55 &[
56 ("id", &self.get_id(order_name)),
57 ("providerName", provider_name),
58 ],
59 PostBody::Raw(Vec::new()),
60 )
61 .await?;
62
63 Ok(serde_json::from_value(response.data)?)
64 }
65
66 pub async fn buy_product(&self, name: &str, user_name: &str) -> Result<Order> {
69 let product_info = ProductInfo {
70 name: name.to_string(),
71 quantity: 1,
72 ..Default::default()
73 };
74
75 self.place_order(&[product_info], user_name).await
76 }
77}