Skip to main content

shopify_client/services/order/
remote.rs

1use crate::{
2    common::{
3        types::{APIError, RequestCallbacks},
4        utils::parse_response_from_text,
5    },
6    types::order::{GetOrderResp, OrderQueryResp, PatchOrderRequest},
7};
8use reqwest::header::{HeaderMap, HeaderValue, CONTENT_TYPE};
9
10pub async fn patch_order(
11    shop_url: &String,
12    version: &String,
13    access_token: &String,
14    callbacks: &RequestCallbacks,
15    order_id: &String,
16    patch_request: &PatchOrderRequest,
17) -> Result<GetOrderResp, APIError> {
18    let endpoint = format!(
19        "{}/admin/api/{}/orders/{}.json",
20        shop_url, version, order_id
21    );
22
23    let body_str = serde_json::to_string(&patch_request).unwrap_or_default();
24
25    let mut callback_headers = HeaderMap::new();
26    callback_headers.insert(CONTENT_TYPE, HeaderValue::from_static("application/json"));
27
28    callbacks.call_before(&endpoint, Some(&body_str), &callback_headers);
29
30    let client = reqwest::Client::new();
31    let response = client
32        .put(&endpoint)
33        .header("X-Shopify-Access-Token", access_token)
34        .header("Content-Type", "application/json")
35        .json(&patch_request)
36        .send()
37        .await;
38
39    match response {
40        Ok(resp) => {
41            let response_headers = resp.headers().clone();
42            let response_text = match resp.text().await {
43                Ok(text) => text,
44                Err(e) => {
45                    let error_msg = format!("<failed to read response body: {}>", e);
46                    callbacks.call_after(&endpoint, &error_msg, &response_headers);
47                    return Err(APIError::FailedToParse);
48                }
49            };
50
51            callbacks.call_after(&endpoint, &response_text, &response_headers);
52
53            parse_response_from_text::<GetOrderResp>(&response_text)
54        }
55        Err(e) => {
56            let error_msg = format!("<network error: {}>", e);
57            callbacks.call_after(&endpoint, &error_msg, &HeaderMap::new());
58            Err(APIError::NetworkError)
59        }
60    }
61}
62
63pub async fn get_order_with_name(
64    shop_url: &String,
65    version: &String,
66    order_name: &String,
67    access_token: &String,
68    callbacks: &RequestCallbacks,
69) -> Result<OrderQueryResp, APIError> {
70    let endpoint = format!(
71        "{}/admin/api/{}/orders.json?query=name:%23{}&status=any",
72        shop_url, version, order_name
73    );
74
75    let callback_headers = HeaderMap::new();
76
77    callbacks.call_before(&endpoint, None, &callback_headers);
78
79    let client = reqwest::Client::new();
80    let response = client
81        .get(&endpoint)
82        .header("X-Shopify-Access-Token", access_token)
83        .send()
84        .await;
85
86    match response {
87        Ok(resp) => {
88            let response_headers = resp.headers().clone();
89            let response_text = match resp.text().await {
90                Ok(text) => text,
91                Err(e) => {
92                    let error_msg = format!("<failed to read response body: {}>", e);
93                    callbacks.call_after(&endpoint, &error_msg, &response_headers);
94                    return Err(APIError::FailedToParse);
95                }
96            };
97
98            callbacks.call_after(&endpoint, &response_text, &response_headers);
99
100            parse_response_from_text::<OrderQueryResp>(&response_text)
101        }
102        Err(e) => {
103            let error_msg = format!("<network error: {}>", e);
104            callbacks.call_after(&endpoint, &error_msg, &HeaderMap::new());
105            Err(APIError::NetworkError)
106        }
107    }
108}
109
110pub async fn get_order_with_id(
111    shop_url: &String,
112    version: &String,
113    access_token: &String,
114    callbacks: &RequestCallbacks,
115    order_id: &String,
116) -> Result<GetOrderResp, APIError> {
117    let endpoint = format!(
118        "{}/admin/api/{}/orders/{}.json",
119        shop_url, version, order_id
120    );
121
122    let callback_headers = HeaderMap::new();
123
124    callbacks.call_before(&endpoint, None, &callback_headers);
125
126    let client = reqwest::Client::new();
127    let response = client
128        .get(&endpoint)
129        .header("X-Shopify-Access-Token", access_token)
130        .send()
131        .await;
132
133    match response {
134        Ok(resp) => {
135            let response_headers = resp.headers().clone();
136            let response_text = match resp.text().await {
137                Ok(text) => text,
138                Err(e) => {
139                    let error_msg = format!("<failed to read response body: {}>", e);
140                    callbacks.call_after(&endpoint, &error_msg, &response_headers);
141                    return Err(APIError::FailedToParse);
142                }
143            };
144
145            callbacks.call_after(&endpoint, &response_text, &response_headers);
146
147            parse_response_from_text::<GetOrderResp>(&response_text)
148        }
149        Err(e) => {
150            let error_msg = format!("<network error: {}>", e);
151            callbacks.call_after(&endpoint, &error_msg, &HeaderMap::new());
152            Err(APIError::NetworkError)
153        }
154    }
155}