hubspot_rust_sdk/objects/
search.rs1use 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}