shopify_client/services/order/
remote.rs1use 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}