Skip to main content

highlevel_api/apis/objects/
types.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Map;
3
4// ── Schema types ────────────────────────────────────────────────────────────
5
6#[derive(Debug, Clone, Serialize, Deserialize, Default)]
7#[serde(rename_all = "camelCase")]
8pub struct ListSchemasParams {
9    pub location_id: String,
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub limit: Option<u32>,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub offset: Option<u32>,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17#[serde(rename_all = "camelCase")]
18pub struct ObjectSchema {
19    pub id: String,
20    pub key: String,
21    pub name: String,
22    pub location_id: String,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub description: Option<String>,
25    #[serde(default)]
26    pub fields: Vec<SchemaField>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub date_added: Option<String>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub date_updated: Option<String>,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
34#[serde(rename_all = "camelCase")]
35pub struct SchemaField {
36    pub key: String,
37    pub name: String,
38    pub field_type: String,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub is_required: Option<bool>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub is_unique: Option<bool>,
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct ListSchemasResponse {
47    pub objects: Vec<ObjectSchema>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub count: Option<u64>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub total: Option<u64>,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
55pub struct GetSchemaResponse {
56    pub object: ObjectSchema,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize, Default)]
60#[serde(rename_all = "camelCase")]
61pub struct CreateSchemaParams {
62    pub name: String,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub description: Option<String>,
65    pub fields: Vec<CreateSchemaField>,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
69#[serde(rename_all = "camelCase")]
70pub struct CreateSchemaField {
71    pub key: String,
72    pub name: String,
73    pub field_type: String,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub is_required: Option<bool>,
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub is_unique: Option<bool>,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize, Default)]
81#[serde(rename_all = "camelCase")]
82pub struct UpdateSchemaParams {
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub name: Option<String>,
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub description: Option<String>,
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub fields: Option<Vec<CreateSchemaField>>,
89}
90
91// ── Record types ────────────────────────────────────────────────────────────
92
93#[derive(Debug, Clone, Serialize, Deserialize, Default)]
94#[serde(rename_all = "camelCase")]
95pub struct CreateRecordParams {
96    pub location_id: String,
97    pub properties: Map<String, serde_json::Value>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize, Default)]
101#[serde(rename_all = "camelCase")]
102pub struct UpdateRecordParams {
103    pub properties: Map<String, serde_json::Value>,
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize)]
107#[serde(rename_all = "camelCase")]
108pub struct ObjectRecord {
109    pub id: String,
110    pub location_id: String,
111    pub schema_key: String,
112    pub properties: Map<String, serde_json::Value>,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub date_added: Option<String>,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub date_updated: Option<String>,
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
120pub struct GetRecordResponse {
121    pub record: ObjectRecord,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize)]
125pub struct CreateRecordResponse {
126    pub record: ObjectRecord,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct DeleteRecordResponse {
131    pub succeeded: bool,
132}
133
134// ── Search types ────────────────────────────────────────────────────────────
135
136#[derive(Debug, Clone, Serialize, Deserialize)]
137#[serde(rename_all = "camelCase")]
138pub struct SearchRecordsParams {
139    pub location_id: String,
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub limit: Option<u32>,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub offset: Option<u32>,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub filters: Option<Vec<SearchFilter>>,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize)]
149#[serde(rename_all = "camelCase")]
150pub struct SearchFilter {
151    pub field: String,
152    pub operator: FilterOperator,
153    pub value: serde_json::Value,
154}
155
156#[derive(Debug, Clone, Serialize, Deserialize)]
157#[serde(rename_all = "snake_case")]
158pub enum FilterOperator {
159    Equals,
160    NotEquals,
161    Contains,
162    NotContains,
163    GreaterThan,
164    LessThan,
165    GreaterThanOrEquals,
166    LessThanOrEquals,
167    Exists,
168    NotExists,
169    In,
170    NotIn,
171    Between,
172}
173
174#[derive(Debug, Clone, Serialize, Deserialize)]
175#[serde(rename_all = "camelCase")]
176pub struct SearchRecordsResponse {
177    pub records: Vec<ObjectRecord>,
178    #[serde(skip_serializing_if = "Option::is_none")]
179    pub total: Option<u64>,
180    #[serde(skip_serializing_if = "Option::is_none")]
181    pub count: Option<u64>,
182}