amazon_spapi/apis/
customer_feedback_2024_06_01.rs

1/*
2 * The Selling Partner API for CustomerFeedback
3 *
4 * The Selling Partner API for Customer Feedback (Customer Feedback API) provides information about customer reviews and returns at both the item and browse node level.
5 *
6 * The version of the OpenAPI document: 2024-06-01
7 * 
8 * Generated by: https://openapi-generator.tech
9 */
10
11
12use reqwest;
13use serde::{Deserialize, Serialize, de::Error as _};
14use crate::{apis::ResponseContent, models};
15use super::{Error, configuration, ContentType};
16
17
18/// struct for typed errors of method [`get_browse_node_return_topics`]
19#[derive(Debug, Clone, Serialize, Deserialize)]
20#[serde(untagged)]
21pub enum GetBrowseNodeReturnTopicsError {
22    Status400(models::customer_feedback_2024_06_01::ErrorList),
23    Status403(models::customer_feedback_2024_06_01::ErrorList),
24    Status404(models::customer_feedback_2024_06_01::ErrorList),
25    Status413(models::customer_feedback_2024_06_01::ErrorList),
26    Status415(models::customer_feedback_2024_06_01::ErrorList),
27    Status429(models::customer_feedback_2024_06_01::ErrorList),
28    Status500(models::customer_feedback_2024_06_01::ErrorList),
29    Status503(models::customer_feedback_2024_06_01::ErrorList),
30    UnknownValue(serde_json::Value),
31}
32
33/// struct for typed errors of method [`get_browse_node_return_trends`]
34#[derive(Debug, Clone, Serialize, Deserialize)]
35#[serde(untagged)]
36pub enum GetBrowseNodeReturnTrendsError {
37    Status400(models::customer_feedback_2024_06_01::ErrorList),
38    Status403(models::customer_feedback_2024_06_01::ErrorList),
39    Status404(models::customer_feedback_2024_06_01::ErrorList),
40    Status413(models::customer_feedback_2024_06_01::ErrorList),
41    Status415(models::customer_feedback_2024_06_01::ErrorList),
42    Status429(models::customer_feedback_2024_06_01::ErrorList),
43    Status500(models::customer_feedback_2024_06_01::ErrorList),
44    Status503(models::customer_feedback_2024_06_01::ErrorList),
45    UnknownValue(serde_json::Value),
46}
47
48/// struct for typed errors of method [`get_browse_node_review_topics`]
49#[derive(Debug, Clone, Serialize, Deserialize)]
50#[serde(untagged)]
51pub enum GetBrowseNodeReviewTopicsError {
52    Status400(models::customer_feedback_2024_06_01::ErrorList),
53    Status403(models::customer_feedback_2024_06_01::ErrorList),
54    Status404(models::customer_feedback_2024_06_01::ErrorList),
55    Status413(models::customer_feedback_2024_06_01::ErrorList),
56    Status415(models::customer_feedback_2024_06_01::ErrorList),
57    Status429(models::customer_feedback_2024_06_01::ErrorList),
58    Status500(models::customer_feedback_2024_06_01::ErrorList),
59    Status503(models::customer_feedback_2024_06_01::ErrorList),
60    UnknownValue(serde_json::Value),
61}
62
63/// struct for typed errors of method [`get_browse_node_review_trends`]
64#[derive(Debug, Clone, Serialize, Deserialize)]
65#[serde(untagged)]
66pub enum GetBrowseNodeReviewTrendsError {
67    Status400(models::customer_feedback_2024_06_01::ErrorList),
68    Status403(models::customer_feedback_2024_06_01::ErrorList),
69    Status404(models::customer_feedback_2024_06_01::ErrorList),
70    Status413(models::customer_feedback_2024_06_01::ErrorList),
71    Status415(models::customer_feedback_2024_06_01::ErrorList),
72    Status429(models::customer_feedback_2024_06_01::ErrorList),
73    Status500(models::customer_feedback_2024_06_01::ErrorList),
74    Status503(models::customer_feedback_2024_06_01::ErrorList),
75    UnknownValue(serde_json::Value),
76}
77
78/// struct for typed errors of method [`get_item_browse_node`]
79#[derive(Debug, Clone, Serialize, Deserialize)]
80#[serde(untagged)]
81pub enum GetItemBrowseNodeError {
82    Status400(models::customer_feedback_2024_06_01::ErrorList),
83    Status403(models::customer_feedback_2024_06_01::ErrorList),
84    Status404(models::customer_feedback_2024_06_01::ErrorList),
85    Status413(models::customer_feedback_2024_06_01::ErrorList),
86    Status415(models::customer_feedback_2024_06_01::ErrorList),
87    Status429(models::customer_feedback_2024_06_01::ErrorList),
88    Status500(models::customer_feedback_2024_06_01::ErrorList),
89    Status503(models::customer_feedback_2024_06_01::ErrorList),
90    UnknownValue(serde_json::Value),
91}
92
93/// struct for typed errors of method [`get_item_review_topics`]
94#[derive(Debug, Clone, Serialize, Deserialize)]
95#[serde(untagged)]
96pub enum GetItemReviewTopicsError {
97    Status400(models::customer_feedback_2024_06_01::ErrorList),
98    Status403(models::customer_feedback_2024_06_01::ErrorList),
99    Status404(models::customer_feedback_2024_06_01::ErrorList),
100    Status413(models::customer_feedback_2024_06_01::ErrorList),
101    Status415(models::customer_feedback_2024_06_01::ErrorList),
102    Status429(models::customer_feedback_2024_06_01::ErrorList),
103    Status500(models::customer_feedback_2024_06_01::ErrorList),
104    Status503(models::customer_feedback_2024_06_01::ErrorList),
105    UnknownValue(serde_json::Value),
106}
107
108/// struct for typed errors of method [`get_item_review_trends`]
109#[derive(Debug, Clone, Serialize, Deserialize)]
110#[serde(untagged)]
111pub enum GetItemReviewTrendsError {
112    Status400(models::customer_feedback_2024_06_01::ErrorList),
113    Status403(models::customer_feedback_2024_06_01::ErrorList),
114    Status404(models::customer_feedback_2024_06_01::ErrorList),
115    Status413(models::customer_feedback_2024_06_01::ErrorList),
116    Status415(models::customer_feedback_2024_06_01::ErrorList),
117    Status429(models::customer_feedback_2024_06_01::ErrorList),
118    Status500(models::customer_feedback_2024_06_01::ErrorList),
119    Status503(models::customer_feedback_2024_06_01::ErrorList),
120    UnknownValue(serde_json::Value),
121}
122
123
124/// Retrieve the topics that customers mention when they return items in a browse node.
125pub async fn get_browse_node_return_topics(configuration: &configuration::Configuration, browse_node_id: &str, marketplace_id: &str) -> Result<models::customer_feedback_2024_06_01::BrowseNodeReturnTopicsResponse, Error<GetBrowseNodeReturnTopicsError>> {
126    // add a prefix to parameters to efficiently prevent name collisions
127    let p_browse_node_id = browse_node_id;
128    let p_marketplace_id = marketplace_id;
129
130    let uri_str = format!("{}/customerFeedback/2024-06-01/browseNodes/{browseNodeId}/returns/topics", configuration.base_path, browseNodeId=crate::apis::urlencode(p_browse_node_id));
131    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
132
133    req_builder = req_builder.query(&[("marketplaceId", &p_marketplace_id.to_string())]);
134    if let Some(ref user_agent) = configuration.user_agent {
135        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
136    }
137
138    let req = req_builder.build()?;
139    let resp = configuration.client.execute(req).await?;
140
141    let status = resp.status();
142    let content_type = resp
143        .headers()
144        .get("content-type")
145        .and_then(|v| v.to_str().ok())
146        .unwrap_or("application/octet-stream");
147    let content_type = super::ContentType::from(content_type);
148
149    if !status.is_client_error() && !status.is_server_error() {
150        let content = resp.text().await?;
151        match content_type {
152            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
153            ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::customer_feedback_2024_06_01::BrowseNodeReturnTopicsResponse`"))),
154            ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::customer_feedback_2024_06_01::BrowseNodeReturnTopicsResponse`")))),
155        }
156    } else {
157        let content = resp.text().await?;
158        let entity: Option<GetBrowseNodeReturnTopicsError> = serde_json::from_str(&content).ok();
159        Err(Error::ResponseError(ResponseContent { status, content, entity }))
160    }
161}
162
163/// Retrieve the trends of topics that customers mention when they return items in a browse node.
164pub async fn get_browse_node_return_trends(configuration: &configuration::Configuration, browse_node_id: &str, marketplace_id: &str) -> Result<models::customer_feedback_2024_06_01::BrowseNodeReturnTrendsResponse, Error<GetBrowseNodeReturnTrendsError>> {
165    // add a prefix to parameters to efficiently prevent name collisions
166    let p_browse_node_id = browse_node_id;
167    let p_marketplace_id = marketplace_id;
168
169    let uri_str = format!("{}/customerFeedback/2024-06-01/browseNodes/{browseNodeId}/returns/trends", configuration.base_path, browseNodeId=crate::apis::urlencode(p_browse_node_id));
170    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
171
172    req_builder = req_builder.query(&[("marketplaceId", &p_marketplace_id.to_string())]);
173    if let Some(ref user_agent) = configuration.user_agent {
174        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
175    }
176
177    let req = req_builder.build()?;
178    let resp = configuration.client.execute(req).await?;
179
180    let status = resp.status();
181    let content_type = resp
182        .headers()
183        .get("content-type")
184        .and_then(|v| v.to_str().ok())
185        .unwrap_or("application/octet-stream");
186    let content_type = super::ContentType::from(content_type);
187
188    if !status.is_client_error() && !status.is_server_error() {
189        let content = resp.text().await?;
190        match content_type {
191            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
192            ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::customer_feedback_2024_06_01::BrowseNodeReturnTrendsResponse`"))),
193            ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::customer_feedback_2024_06_01::BrowseNodeReturnTrendsResponse`")))),
194        }
195    } else {
196        let content = resp.text().await?;
197        let entity: Option<GetBrowseNodeReturnTrendsError> = serde_json::from_str(&content).ok();
198        Err(Error::ResponseError(ResponseContent { status, content, entity }))
199    }
200}
201
202/// Retrieve a browse node's ten most positive and ten most negative review topics.
203pub async fn get_browse_node_review_topics(configuration: &configuration::Configuration, browse_node_id: &str, marketplace_id: &str, sort_by: &str) -> Result<models::customer_feedback_2024_06_01::BrowseNodeReviewTopicsResponse, Error<GetBrowseNodeReviewTopicsError>> {
204    // add a prefix to parameters to efficiently prevent name collisions
205    let p_browse_node_id = browse_node_id;
206    let p_marketplace_id = marketplace_id;
207    let p_sort_by = sort_by;
208
209    let uri_str = format!("{}/customerFeedback/2024-06-01/browseNodes/{browseNodeId}/reviews/topics", configuration.base_path, browseNodeId=crate::apis::urlencode(p_browse_node_id));
210    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
211
212    req_builder = req_builder.query(&[("marketplaceId", &p_marketplace_id.to_string())]);
213    req_builder = req_builder.query(&[("sortBy", &p_sort_by.to_string())]);
214    if let Some(ref user_agent) = configuration.user_agent {
215        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
216    }
217
218    let req = req_builder.build()?;
219    let resp = configuration.client.execute(req).await?;
220
221    let status = resp.status();
222    let content_type = resp
223        .headers()
224        .get("content-type")
225        .and_then(|v| v.to_str().ok())
226        .unwrap_or("application/octet-stream");
227    let content_type = super::ContentType::from(content_type);
228
229    if !status.is_client_error() && !status.is_server_error() {
230        let content = resp.text().await?;
231        match content_type {
232            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
233            ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::customer_feedback_2024_06_01::BrowseNodeReviewTopicsResponse`"))),
234            ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::customer_feedback_2024_06_01::BrowseNodeReviewTopicsResponse`")))),
235        }
236    } else {
237        let content = resp.text().await?;
238        let entity: Option<GetBrowseNodeReviewTopicsError> = serde_json::from_str(&content).ok();
239        Err(Error::ResponseError(ResponseContent { status, content, entity }))
240    }
241}
242
243/// Retrieve the positive and negative review trends of items in a browse node for the past six months.
244pub async fn get_browse_node_review_trends(configuration: &configuration::Configuration, browse_node_id: &str, marketplace_id: &str) -> Result<models::customer_feedback_2024_06_01::BrowseNodeReviewTrendsResponse, Error<GetBrowseNodeReviewTrendsError>> {
245    // add a prefix to parameters to efficiently prevent name collisions
246    let p_browse_node_id = browse_node_id;
247    let p_marketplace_id = marketplace_id;
248
249    let uri_str = format!("{}/customerFeedback/2024-06-01/browseNodes/{browseNodeId}/reviews/trends", configuration.base_path, browseNodeId=crate::apis::urlencode(p_browse_node_id));
250    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
251
252    req_builder = req_builder.query(&[("marketplaceId", &p_marketplace_id.to_string())]);
253    if let Some(ref user_agent) = configuration.user_agent {
254        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
255    }
256
257    let req = req_builder.build()?;
258    let resp = configuration.client.execute(req).await?;
259
260    let status = resp.status();
261    let content_type = resp
262        .headers()
263        .get("content-type")
264        .and_then(|v| v.to_str().ok())
265        .unwrap_or("application/octet-stream");
266    let content_type = super::ContentType::from(content_type);
267
268    if !status.is_client_error() && !status.is_server_error() {
269        let content = resp.text().await?;
270        match content_type {
271            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
272            ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::customer_feedback_2024_06_01::BrowseNodeReviewTrendsResponse`"))),
273            ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::customer_feedback_2024_06_01::BrowseNodeReviewTrendsResponse`")))),
274        }
275    } else {
276        let content = resp.text().await?;
277        let entity: Option<GetBrowseNodeReviewTrendsError> = serde_json::from_str(&content).ok();
278        Err(Error::ResponseError(ResponseContent { status, content, entity }))
279    }
280}
281
282/// This API returns the associated browse node of the requested ASIN. A browse node is a location in a browse tree that is used for navigation, product classification, and website content on the Amazon retail website.
283pub async fn get_item_browse_node(configuration: &configuration::Configuration, asin: &str, marketplace_id: &str) -> Result<models::customer_feedback_2024_06_01::BrowseNodeResponse, Error<GetItemBrowseNodeError>> {
284    // add a prefix to parameters to efficiently prevent name collisions
285    let p_asin = asin;
286    let p_marketplace_id = marketplace_id;
287
288    let uri_str = format!("{}/customerFeedback/2024-06-01/items/{asin}/browseNode", configuration.base_path, asin=crate::apis::urlencode(p_asin));
289    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
290
291    req_builder = req_builder.query(&[("marketplaceId", &p_marketplace_id.to_string())]);
292    if let Some(ref user_agent) = configuration.user_agent {
293        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
294    }
295
296    let req = req_builder.build()?;
297    let resp = configuration.client.execute(req).await?;
298
299    let status = resp.status();
300    let content_type = resp
301        .headers()
302        .get("content-type")
303        .and_then(|v| v.to_str().ok())
304        .unwrap_or("application/octet-stream");
305    let content_type = super::ContentType::from(content_type);
306
307    if !status.is_client_error() && !status.is_server_error() {
308        let content = resp.text().await?;
309        match content_type {
310            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
311            ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::customer_feedback_2024_06_01::BrowseNodeResponse`"))),
312            ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::customer_feedback_2024_06_01::BrowseNodeResponse`")))),
313        }
314    } else {
315        let content = resp.text().await?;
316        let entity: Option<GetItemBrowseNodeError> = serde_json::from_str(&content).ok();
317        Err(Error::ResponseError(ResponseContent { status, content, entity }))
318    }
319}
320
321/// Retrieve an item's ten most positive and ten most negative review topics.
322pub async fn get_item_review_topics(configuration: &configuration::Configuration, asin: &str, marketplace_id: &str, sort_by: &str) -> Result<models::customer_feedback_2024_06_01::ItemReviewTopicsResponse, Error<GetItemReviewTopicsError>> {
323    // add a prefix to parameters to efficiently prevent name collisions
324    let p_asin = asin;
325    let p_marketplace_id = marketplace_id;
326    let p_sort_by = sort_by;
327
328    let uri_str = format!("{}/customerFeedback/2024-06-01/items/{asin}/reviews/topics", configuration.base_path, asin=crate::apis::urlencode(p_asin));
329    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
330
331    req_builder = req_builder.query(&[("marketplaceId", &p_marketplace_id.to_string())]);
332    req_builder = req_builder.query(&[("sortBy", &p_sort_by.to_string())]);
333    if let Some(ref user_agent) = configuration.user_agent {
334        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
335    }
336
337    let req = req_builder.build()?;
338    let resp = configuration.client.execute(req).await?;
339
340    let status = resp.status();
341    let content_type = resp
342        .headers()
343        .get("content-type")
344        .and_then(|v| v.to_str().ok())
345        .unwrap_or("application/octet-stream");
346    let content_type = super::ContentType::from(content_type);
347
348    if !status.is_client_error() && !status.is_server_error() {
349        let content = resp.text().await?;
350        match content_type {
351            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
352            ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::customer_feedback_2024_06_01::ItemReviewTopicsResponse`"))),
353            ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::customer_feedback_2024_06_01::ItemReviewTopicsResponse`")))),
354        }
355    } else {
356        let content = resp.text().await?;
357        let entity: Option<GetItemReviewTopicsError> = serde_json::from_str(&content).ok();
358        Err(Error::ResponseError(ResponseContent { status, content, entity }))
359    }
360}
361
362/// Retrieve an item's positive and negative review trends for the past six months.
363pub async fn get_item_review_trends(configuration: &configuration::Configuration, asin: &str, marketplace_id: &str) -> Result<models::customer_feedback_2024_06_01::ItemReviewTrendsResponse, Error<GetItemReviewTrendsError>> {
364    // add a prefix to parameters to efficiently prevent name collisions
365    let p_asin = asin;
366    let p_marketplace_id = marketplace_id;
367
368    let uri_str = format!("{}/customerFeedback/2024-06-01/items/{asin}/reviews/trends", configuration.base_path, asin=crate::apis::urlencode(p_asin));
369    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
370
371    req_builder = req_builder.query(&[("marketplaceId", &p_marketplace_id.to_string())]);
372    if let Some(ref user_agent) = configuration.user_agent {
373        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
374    }
375
376    let req = req_builder.build()?;
377    let resp = configuration.client.execute(req).await?;
378
379    let status = resp.status();
380    let content_type = resp
381        .headers()
382        .get("content-type")
383        .and_then(|v| v.to_str().ok())
384        .unwrap_or("application/octet-stream");
385    let content_type = super::ContentType::from(content_type);
386
387    if !status.is_client_error() && !status.is_server_error() {
388        let content = resp.text().await?;
389        match content_type {
390            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
391            ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::customer_feedback_2024_06_01::ItemReviewTrendsResponse`"))),
392            ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::customer_feedback_2024_06_01::ItemReviewTrendsResponse`")))),
393        }
394    } else {
395        let content = resp.text().await?;
396        let entity: Option<GetItemReviewTrendsError> = serde_json::from_str(&content).ok();
397        Err(Error::ResponseError(ResponseContent { status, content, entity }))
398    }
399}
400