Skip to main content

shopify_client/admin/access_scope/
remote.rs

1use reqwest::header::HeaderMap;
2
3use crate::{
4    admin::generated::types::access_scope::AccessScopesResp,
5    common::{http::http_client, types::APIError, utils::parse_response_from_text, ServiceContext},
6};
7
8pub async fn list_access_scopes(ctx: &ServiceContext) -> Result<AccessScopesResp, APIError> {
9    let endpoint = format!(
10        "{}/admin/oauth/access_scopes.json",
11        ctx.shop_url.trim_end_matches('/')
12    );
13
14    let callback_headers = HeaderMap::new();
15
16    ctx.callbacks
17        .call_before(&endpoint, None, &callback_headers);
18
19    let response = http_client()
20        .get(&endpoint)
21        .header("X-Shopify-Access-Token", &*ctx.access_token)
22        .header("Content-Type", "application/json")
23        .send()
24        .await;
25
26    match response {
27        Ok(resp) => {
28            let response_headers = resp.headers().clone();
29            let response_text = match resp.text().await {
30                Ok(text) => text,
31                Err(e) => {
32                    let error_msg = format!("<failed to read response body: {}>", e);
33                    ctx.callbacks
34                        .call_after(&endpoint, &error_msg, &response_headers);
35                    return Err(APIError::FailedToParse);
36                }
37            };
38
39            ctx.callbacks
40                .call_after(&endpoint, &response_text, &response_headers);
41
42            parse_response_from_text::<AccessScopesResp>(&response_text)
43        }
44        Err(e) => {
45            let error_msg = format!("<network error: {}>", e);
46            ctx.callbacks
47                .call_after(&endpoint, &error_msg, &HeaderMap::new());
48            Err(APIError::NetworkError)
49        }
50    }
51}