hubspot_rust_sdk/objects/
search.rs

1use serde::Serialize;
2use serde_json::{json, Value};
3use crate::universals::{client::HubSpotClient, pagination::{CreateBody, PaginationBodyParams, TurnPageMethod}, requests::HttpMethod};
4use super::types::{HubSpotObject, HubSpotObjectType};
5
6#[derive(Debug, Serialize)]
7pub struct FilterGroup {
8    pub filters: Vec<Filter>,
9}
10
11#[derive(Debug, Serialize)]
12pub struct Filter {
13    #[serde(rename = "propertyName")]
14    pub property_name: String,
15    pub operator: String,
16    pub value: String,
17}
18
19impl HubSpotClient {
20    pub async fn search(
21        &self,
22        object_type: HubSpotObjectType,
23        filter: Vec<FilterGroup>,
24        properties: Vec<&str>,
25        max_amount: Option<usize>
26    ) -> Result<Vec<HubSpotObject>, String> {
27        self.request_with_pagination(
28            format!("/crm/v3/objects/{object_type}/search"),
29            HttpMethod::Post,
30            Some(CreateBody {
31                static_body: json!({
32                    "filterGroups": filter,
33                    "properties": properties,
34                }),
35                create_body
36            }),
37            max_amount,
38            get_after_pagination
39        ).await
40    }
41}
42
43fn create_body(
44    mut static_body: Value,
45    dynamic_params: PaginationBodyParams
46) -> Value {
47    if let Some(after) = dynamic_params.after {
48        static_body["after"] = json!(after);
49    }
50    if let Some(limit) = dynamic_params.limit {
51        static_body["limit"] = json!(limit);
52    }
53    static_body
54}
55
56pub fn get_after_pagination(body: &Value) -> Option<TurnPageMethod> {
57    match body["paging"]["next"]["after"].as_str() {
58        Some(after) => match after.parse::<usize>() {
59            Ok(after) => return Some(TurnPageMethod::After(after)),
60            Err(_) => None,
61        },
62        None => None,
63    }
64}