Skip to main content

ghl_models/v2/
products.rs

1// @generated by xtask/generate_models.py — do not edit by hand.
2// Source: https://github.com/GoHighLevel/highlevel-api-docs
3// Doc comments are HighLevel's own field descriptions, reflowed verbatim, so
4// they aren't held to rustdoc's markdown conventions.
5#![allow(
6    missing_docs,
7    clippy::doc_lazy_continuation,
8    clippy::doc_overindented_list_items
9)]
10
11use serde::{Deserialize, Serialize};
12
13/// `BulkEditPriceDto` from the GoHighLevel OpenAPI spec.
14#[derive(Debug, Clone, Default, Serialize, Deserialize)]
15pub struct BulkEditPriceDto {
16    /// Price ID
17    /// Required by the API.
18    #[serde(rename = "_id")]
19    pub id: String,
20    /// Price name
21    #[serde(default, skip_serializing_if = "Option::is_none")]
22    pub name: Option<String>,
23    /// Price amount
24    #[serde(default, skip_serializing_if = "Option::is_none")]
25    pub amount: Option<f64>,
26    /// Price currency
27    #[serde(default, skip_serializing_if = "Option::is_none")]
28    pub currency: Option<String>,
29    /// Compare at price
30    #[serde(
31        rename = "compareAtPrice",
32        default,
33        skip_serializing_if = "Option::is_none"
34    )]
35    pub compare_at_price: Option<f64>,
36    /// Available quantity
37    #[serde(
38        rename = "availableQuantity",
39        default,
40        skip_serializing_if = "Option::is_none"
41    )]
42    pub available_quantity: Option<f64>,
43    /// Track inventory
44    #[serde(
45        rename = "trackInventory",
46        default,
47        skip_serializing_if = "Option::is_none"
48    )]
49    pub track_inventory: Option<bool>,
50    /// Allow out of stock purchases
51    #[serde(
52        rename = "allowOutOfStockPurchases",
53        default,
54        skip_serializing_if = "Option::is_none"
55    )]
56    pub allow_out_of_stock_purchases: Option<bool>,
57    /// SKU
58    #[serde(default, skip_serializing_if = "Option::is_none")]
59    pub sku: Option<String>,
60    /// Trial period in days
61    #[serde(
62        rename = "trialPeriod",
63        default,
64        skip_serializing_if = "Option::is_none"
65    )]
66    pub trial_period: Option<f64>,
67    /// Total billing cycles
68    #[serde(
69        rename = "totalCycles",
70        default,
71        skip_serializing_if = "Option::is_none"
72    )]
73    pub total_cycles: Option<f64>,
74    /// Setup fee
75    #[serde(rename = "setupFee", default, skip_serializing_if = "Option::is_none")]
76    pub setup_fee: Option<f64>,
77    /// Shipping options
78    #[serde(
79        rename = "shippingOptions",
80        default,
81        skip_serializing_if = "Option::is_none"
82    )]
83    pub shipping_options: Option<ShippingOptionsDto>,
84    /// Recurring details
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub recurring: Option<RecurringDto>,
87}
88
89/// `BulkEditProductDto` from the GoHighLevel OpenAPI spec.
90#[derive(Debug, Clone, Default, Serialize, Deserialize)]
91pub struct BulkEditProductDto {
92    /// Product ID
93    /// Required by the API.
94    #[serde(rename = "_id")]
95    pub id: String,
96    /// Product name
97    #[serde(default, skip_serializing_if = "Option::is_none")]
98    pub name: Option<String>,
99    /// Product description
100    #[serde(default, skip_serializing_if = "Option::is_none")]
101    pub description: Option<String>,
102    /// Product image
103    #[serde(default, skip_serializing_if = "Option::is_none")]
104    pub image: Option<String>,
105    /// Product availability in store
106    #[serde(
107        rename = "availableInStore",
108        default,
109        skip_serializing_if = "Option::is_none"
110    )]
111    pub available_in_store: Option<bool>,
112    /// Array of price variants for the product
113    #[serde(default, skip_serializing_if = "Vec::is_empty")]
114    pub prices: Vec<BulkEditPriceDto>,
115    /// Collection IDs
116    #[serde(
117        rename = "collectionIds",
118        default,
119        skip_serializing_if = "Vec::is_empty"
120    )]
121    pub collection_ids: Vec<String>,
122    /// Enable product label
123    #[serde(
124        rename = "isLabelEnabled",
125        default,
126        skip_serializing_if = "Option::is_none"
127    )]
128    pub is_label_enabled: Option<bool>,
129    /// Enable taxes
130    #[serde(
131        rename = "isTaxesEnabled",
132        default,
133        skip_serializing_if = "Option::is_none"
134    )]
135    pub is_taxes_enabled: Option<bool>,
136    /// SEO metadata for the product
137    #[serde(default, skip_serializing_if = "Option::is_none")]
138    pub seo: Option<ProductSEODto>,
139    /// Product URL slug
140    #[serde(default, skip_serializing_if = "Option::is_none")]
141    pub slug: Option<String>,
142    /// Automatic tax category ID
143    #[serde(
144        rename = "automaticTaxCategoryId",
145        default,
146        skip_serializing_if = "Option::is_none"
147    )]
148    pub automatic_tax_category_id: Option<String>,
149    /// Tax inclusive pricing
150    #[serde(
151        rename = "taxInclusive",
152        default,
153        skip_serializing_if = "Option::is_none"
154    )]
155    pub tax_inclusive: Option<bool>,
156    /// Product taxes
157    #[serde(default, skip_serializing_if = "Vec::is_empty")]
158    pub taxes: Vec<serde_json::Value>,
159    /// Product media
160    #[serde(default, skip_serializing_if = "Vec::is_empty")]
161    pub medias: Vec<serde_json::Value>,
162    /// Product label
163    #[serde(default, skip_serializing_if = "Option::is_none")]
164    pub label: Option<serde_json::Value>,
165}
166
167/// `BulkEditRequestDto` from the GoHighLevel OpenAPI spec.
168#[derive(Debug, Clone, Default, Serialize, Deserialize)]
169pub struct BulkEditRequestDto {
170    /// Location Id or Agency Id
171    /// Required by the API.
172    #[serde(rename = "altId")]
173    pub alt_id: String,
174    /// Allowed values: `location`.
175    /// Required by the API.
176    #[serde(rename = "altType")]
177    pub alt_type: String,
178    /// Array of products to update. Note: The total count includes all prices within each
179    /// product.
180    /// Required by the API.
181    #[serde(default, skip_serializing_if = "Vec::is_empty")]
182    pub products: Vec<BulkEditProductDto>,
183}
184
185/// `BulkEditResponseDto` from the GoHighLevel OpenAPI spec.
186#[derive(Debug, Clone, Default, Serialize, Deserialize)]
187pub struct BulkEditResponseDto {
188    /// Success message
189    /// Required by the API.
190    pub message: String,
191    /// Operation status
192    /// Required by the API.
193    pub status: bool,
194    /// Number of products updated
195    /// Required by the API.
196    #[serde(rename = "updatedCount")]
197    pub updated_count: f64,
198}
199
200/// `BulkUpdateDto` from the GoHighLevel OpenAPI spec.
201#[derive(Debug, Clone, Default, Serialize, Deserialize)]
202pub struct BulkUpdateDto {
203    /// Location Id or Agency Id
204    /// Required by the API.
205    #[serde(rename = "altId")]
206    pub alt_id: String,
207    /// Allowed values: `location`.
208    /// Required by the API.
209    #[serde(rename = "altType")]
210    pub alt_type: String,
211    /// Type of bulk update operation
212    /// Allowed values: `bulk-update-price`, `bulk-update-availability`,
213    /// `bulk-update-product-collection`, `bulk-delete-products`, `bulk-update-currency`.
214    /// Required by the API.
215    #[serde(rename = "type")]
216    pub type_: String,
217    /// Array of product IDs
218    /// Required by the API.
219    #[serde(rename = "productIds", default, skip_serializing_if = "Vec::is_empty")]
220    pub product_ids: Vec<String>,
221    /// Filters to apply when selectAll is true
222    #[serde(default, skip_serializing_if = "Option::is_none")]
223    pub filters: Option<BulkUpdateFilters>,
224    /// Price update configuration
225    #[serde(default, skip_serializing_if = "Option::is_none")]
226    pub price: Option<PriceUpdateField>,
227    /// Compare at price update configuration
228    #[serde(
229        rename = "compareAtPrice",
230        default,
231        skip_serializing_if = "Option::is_none"
232    )]
233    pub compare_at_price: Option<PriceUpdateField>,
234    /// New availability status
235    #[serde(default, skip_serializing_if = "Option::is_none")]
236    pub availability: Option<bool>,
237    /// Array of collection IDs
238    #[serde(
239        rename = "collectionIds",
240        default,
241        skip_serializing_if = "Vec::is_empty"
242    )]
243    pub collection_ids: Vec<String>,
244    /// Currency code
245    #[serde(default, skip_serializing_if = "Option::is_none")]
246    pub currency: Option<String>,
247}
248
249/// `BulkUpdateFilters` from the GoHighLevel OpenAPI spec.
250#[derive(Debug, Clone, Default, Serialize, Deserialize)]
251pub struct BulkUpdateFilters {
252    /// Filter by collection IDs
253    #[serde(
254        rename = "collectionIds",
255        default,
256        skip_serializing_if = "Vec::is_empty"
257    )]
258    pub collection_ids: Vec<String>,
259    /// Filter by product type
260    #[serde(
261        rename = "productType",
262        default,
263        skip_serializing_if = "Option::is_none"
264    )]
265    pub product_type: Option<String>,
266    /// Filter by availability status
267    #[serde(
268        rename = "availableInStore",
269        default,
270        skip_serializing_if = "Option::is_none"
271    )]
272    pub available_in_store: Option<bool>,
273    /// Filter by search term
274    #[serde(default, skip_serializing_if = "Option::is_none")]
275    pub search: Option<String>,
276}
277
278/// `BulkUpdateResponseDto` from the GoHighLevel OpenAPI spec.
279#[derive(Debug, Clone, Default, Serialize, Deserialize)]
280pub struct BulkUpdateResponseDto {
281    /// Status of api action
282    /// Required by the API.
283    pub status: bool,
284    /// Success message
285    #[serde(default, skip_serializing_if = "Option::is_none")]
286    pub message: Option<String>,
287}
288
289/// `CollectionSEODto` from the GoHighLevel OpenAPI spec.
290#[derive(Debug, Clone, Default, Serialize, Deserialize)]
291pub struct CollectionSEODto {
292    /// The title which will be displayed as an SEO format
293    #[serde(default, skip_serializing_if = "Option::is_none")]
294    pub title: Option<String>,
295    /// The description which would be displayed in preview purposes
296    #[serde(default, skip_serializing_if = "Option::is_none")]
297    pub description: Option<String>,
298}
299
300/// `CollectionSchema` from the GoHighLevel OpenAPI spec.
301#[derive(Debug, Clone, Default, Serialize, Deserialize)]
302pub struct CollectionSchema {
303    /// The unique identifier for the collection
304    /// Required by the API.
305    #[serde(rename = "_id")]
306    pub id: String,
307    /// Location Id to which the collection is associated
308    /// Required by the API.
309    #[serde(rename = "altId")]
310    pub alt_id: String,
311    /// Name of the collection
312    /// Required by the API.
313    pub name: String,
314    /// Slug of the collection with which navigation is established. Special Characters and
315    /// spacing is not allowed and should be unique
316    /// Required by the API.
317    pub slug: String,
318    /// The URL of the image that is going to be displayed as the collection Thumbnail
319    /// Required by the API.
320    pub image: String,
321    /// The information which will be displayed in SEO previews
322    /// Required by the API.
323    pub seo: CollectionSEODto,
324    /// Date at which the collection was created
325    /// Required by the API.
326    #[serde(rename = "createdAt")]
327    pub created_at: String,
328}
329
330/// `CountReviewsByStatusResponseDto` from the GoHighLevel OpenAPI spec.
331#[derive(Debug, Clone, Default, Serialize, Deserialize)]
332pub struct CountReviewsByStatusResponseDto {
333    /// Array of review status counts
334    /// Required by the API.
335    #[serde(default, skip_serializing_if = "Vec::is_empty")]
336    pub data: Vec<Vec<serde_json::Value>>,
337}
338
339/// `CreateCollectionResponseDto` from the GoHighLevel OpenAPI spec.
340#[derive(Debug, Clone, Default, Serialize, Deserialize)]
341pub struct CreateCollectionResponseDto {
342    /// created Collection
343    /// Required by the API.
344    pub data: CollectionSchema,
345}
346
347/// `CreatePriceDto` from the GoHighLevel OpenAPI spec.
348#[derive(Debug, Clone, Default, Serialize, Deserialize)]
349pub struct CreatePriceDto {
350    /// The name of the price.
351    /// Required by the API.
352    pub name: String,
353    /// The type of the price.
354    /// Allowed values: `one_time`, `recurring`.
355    /// Required by the API.
356    #[serde(rename = "type")]
357    pub type_: String,
358    /// The currency of the price.
359    /// Required by the API.
360    pub currency: String,
361    /// The amount of the price. ( min: 0 )
362    /// Required by the API.
363    pub amount: f64,
364    /// The recurring details of the price (if type is recurring).
365    #[serde(default, skip_serializing_if = "Option::is_none")]
366    pub recurring: Option<RecurringDto>,
367    /// A brief description of the price.
368    #[serde(default, skip_serializing_if = "Option::is_none")]
369    pub description: Option<String>,
370    /// An array of membership offers associated with the price.
371    #[serde(
372        rename = "membershipOffers",
373        default,
374        skip_serializing_if = "Vec::is_empty"
375    )]
376    pub membership_offers: Vec<MembershipOfferDto>,
377    /// The trial period duration in days (if applicable).
378    #[serde(
379        rename = "trialPeriod",
380        default,
381        skip_serializing_if = "Option::is_none"
382    )]
383    pub trial_period: Option<f64>,
384    /// The total number of billing cycles for the price. ( min: 1 )
385    #[serde(
386        rename = "totalCycles",
387        default,
388        skip_serializing_if = "Option::is_none"
389    )]
390    pub total_cycles: Option<f64>,
391    /// The setup fee for the price.
392    #[serde(rename = "setupFee", default, skip_serializing_if = "Option::is_none")]
393    pub setup_fee: Option<f64>,
394    /// An array of variant option IDs associated with the price.
395    #[serde(
396        rename = "variantOptionIds",
397        default,
398        skip_serializing_if = "Vec::is_empty"
399    )]
400    pub variant_option_ids: Vec<String>,
401    /// The compare at price for the price.
402    #[serde(
403        rename = "compareAtPrice",
404        default,
405        skip_serializing_if = "Option::is_none"
406    )]
407    pub compare_at_price: Option<f64>,
408    /// The unique identifier of the location associated with the price.
409    /// Required by the API.
410    #[serde(rename = "locationId")]
411    pub location_id: String,
412    /// The unique identifier of the user who created the price.
413    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
414    pub user_id: Option<String>,
415    /// Additional metadata associated with the price.
416    #[serde(default, skip_serializing_if = "Option::is_none")]
417    pub meta: Option<PriceMetaDto>,
418    /// Need to track inventory stock quantity
419    #[serde(
420        rename = "trackInventory",
421        default,
422        skip_serializing_if = "Option::is_none"
423    )]
424    pub track_inventory: Option<bool>,
425    /// Available inventory stock quantity
426    #[serde(
427        rename = "availableQuantity",
428        default,
429        skip_serializing_if = "Option::is_none"
430    )]
431    pub available_quantity: Option<f64>,
432    /// Continue selling when out of stock
433    #[serde(
434        rename = "allowOutOfStockPurchases",
435        default,
436        skip_serializing_if = "Option::is_none"
437    )]
438    pub allow_out_of_stock_purchases: Option<bool>,
439    /// The unique identifier of the SKU associated with the price
440    #[serde(default, skip_serializing_if = "Option::is_none")]
441    pub sku: Option<String>,
442    /// Shipping options of the Price
443    #[serde(
444        rename = "shippingOptions",
445        default,
446        skip_serializing_if = "Option::is_none"
447    )]
448    pub shipping_options: Option<ShippingOptionsDto>,
449    /// Is the product a digital product
450    #[serde(
451        rename = "isDigitalProduct",
452        default,
453        skip_serializing_if = "Option::is_none"
454    )]
455    pub is_digital_product: Option<bool>,
456    /// Digital delivery options
457    #[serde(
458        rename = "digitalDelivery",
459        default,
460        skip_serializing_if = "Vec::is_empty"
461    )]
462    pub digital_delivery: Vec<String>,
463}
464
465/// `CreatePriceResponseDto` from the GoHighLevel OpenAPI spec.
466#[derive(Debug, Clone, Default, Serialize, Deserialize)]
467pub struct CreatePriceResponseDto {
468    /// The unique identifier for the price.
469    /// Required by the API.
470    #[serde(rename = "_id")]
471    pub id: String,
472    /// An array of membership offers associated with the price.
473    #[serde(
474        rename = "membershipOffers",
475        default,
476        skip_serializing_if = "Vec::is_empty"
477    )]
478    pub membership_offers: Vec<MembershipOfferDto>,
479    /// An array of variant option IDs associated with the price.
480    #[serde(
481        rename = "variantOptionIds",
482        default,
483        skip_serializing_if = "Vec::is_empty"
484    )]
485    pub variant_option_ids: Vec<String>,
486    /// The unique identifier for the location.
487    #[serde(
488        rename = "locationId",
489        default,
490        skip_serializing_if = "Option::is_none"
491    )]
492    pub location_id: Option<String>,
493    /// The unique identifier for the associated product.
494    #[serde(default, skip_serializing_if = "Option::is_none")]
495    pub product: Option<String>,
496    /// The unique identifier for the user.
497    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
498    pub user_id: Option<String>,
499    /// The name of the price.
500    /// Required by the API.
501    pub name: String,
502    /// The type of the price (e.g., one_time).
503    /// Allowed values: `one_time`, `recurring`.
504    /// Required by the API.
505    #[serde(rename = "type")]
506    pub type_: String,
507    /// The currency code for the price.
508    /// Required by the API.
509    pub currency: String,
510    /// The amount of the price.
511    /// Required by the API.
512    pub amount: f64,
513    /// The recurring details of the price (if type is recurring).
514    #[serde(default, skip_serializing_if = "Option::is_none")]
515    pub recurring: Option<RecurringDto>,
516    /// The creation timestamp of the price.
517    /// Format: date-time (ISO-8601 string).
518    #[serde(rename = "createdAt", default, skip_serializing_if = "Option::is_none")]
519    pub created_at: Option<String>,
520    /// The last update timestamp of the price.
521    /// Format: date-time (ISO-8601 string).
522    #[serde(rename = "updatedAt", default, skip_serializing_if = "Option::is_none")]
523    pub updated_at: Option<String>,
524    /// The compare-at price for comparison purposes.
525    #[serde(
526        rename = "compareAtPrice",
527        default,
528        skip_serializing_if = "Option::is_none"
529    )]
530    pub compare_at_price: Option<f64>,
531    /// Indicates whether inventory tracking is enabled.
532    #[serde(
533        rename = "trackInventory",
534        default,
535        skip_serializing_if = "Option::is_none"
536    )]
537    pub track_inventory: Option<bool>,
538    /// Available inventory stock quantity
539    #[serde(
540        rename = "availableQuantity",
541        default,
542        skip_serializing_if = "Option::is_none"
543    )]
544    pub available_quantity: Option<f64>,
545    /// Continue selling when out of stock
546    #[serde(
547        rename = "allowOutOfStockPurchases",
548        default,
549        skip_serializing_if = "Option::is_none"
550    )]
551    pub allow_out_of_stock_purchases: Option<bool>,
552}
553
554/// `CreateProductCollectionsDto` from the GoHighLevel OpenAPI spec.
555#[derive(Debug, Clone, Default, Serialize, Deserialize)]
556pub struct CreateProductCollectionsDto {
557    /// Location Id
558    /// Required by the API.
559    #[serde(rename = "altId")]
560    pub alt_id: String,
561    /// The type of alt. For now it is only LOCATION
562    /// Allowed values: `location`.
563    /// Required by the API.
564    #[serde(rename = "altType")]
565    pub alt_type: String,
566    /// Unique Identifier of the Product Collection, Mongo Id
567    #[serde(
568        rename = "collectionId",
569        default,
570        skip_serializing_if = "Option::is_none"
571    )]
572    pub collection_id: Option<String>,
573    /// Name of the Product Collection
574    /// Required by the API.
575    pub name: String,
576    /// Slug of the Product Collection which helps in navigation
577    /// Required by the API.
578    pub slug: String,
579    /// The URL of the image that is going to be displayed as the collection Thumbnail
580    #[serde(default, skip_serializing_if = "Option::is_none")]
581    pub image: Option<String>,
582    /// The metadata information which will be displayed in SEO previews
583    #[serde(default, skip_serializing_if = "Option::is_none")]
584    pub seo: Option<CollectionSEODto>,
585}
586
587/// `CreateProductDto` from the GoHighLevel OpenAPI spec.
588#[derive(Debug, Clone, Default, Serialize, Deserialize)]
589pub struct CreateProductDto {
590    /// The name of the product.
591    /// Required by the API.
592    pub name: String,
593    /// The unique identifier for the location.
594    /// Required by the API.
595    #[serde(rename = "locationId")]
596    pub location_id: String,
597    /// A brief description of the product.
598    #[serde(default, skip_serializing_if = "Option::is_none")]
599    pub description: Option<String>,
600    /// Allowed values: `DIGITAL`, `PHYSICAL`, `SERVICE`, `PHYSICAL/DIGITAL`.
601    /// Required by the API.
602    #[serde(rename = "productType")]
603    pub product_type: String,
604    /// The URL for the product image.
605    #[serde(default, skip_serializing_if = "Option::is_none")]
606    pub image: Option<String>,
607    /// The statement descriptor for the product.
608    #[serde(
609        rename = "statementDescriptor",
610        default,
611        skip_serializing_if = "Option::is_none"
612    )]
613    pub statement_descriptor: Option<String>,
614    /// Indicates whether the product is available in-store.
615    #[serde(
616        rename = "availableInStore",
617        default,
618        skip_serializing_if = "Option::is_none"
619    )]
620    pub available_in_store: Option<bool>,
621    /// An array of medias for the product.
622    #[serde(default, skip_serializing_if = "Vec::is_empty")]
623    pub medias: Vec<ProductMediaDto>,
624    /// An array of variants for the product.
625    #[serde(default, skip_serializing_if = "Vec::is_empty")]
626    pub variants: Vec<ProductVariantDto>,
627    /// An array of category Ids for the product
628    #[serde(
629        rename = "collectionIds",
630        default,
631        skip_serializing_if = "Vec::is_empty"
632    )]
633    pub collection_ids: Vec<String>,
634    /// Are there any taxes attached to the product. If this is true, taxes array cannot be
635    /// empty.
636    #[serde(
637        rename = "isTaxesEnabled",
638        default,
639        skip_serializing_if = "Option::is_none"
640    )]
641    pub is_taxes_enabled: Option<bool>,
642    /// List of ids of Taxes attached to the Product. If taxes are passed, isTaxesEnabled should
643    /// be true.
644    #[serde(default, skip_serializing_if = "Vec::is_empty")]
645    pub taxes: Vec<String>,
646    /// Tax category ID for Automatic taxes calculation.
647    #[serde(
648        rename = "automaticTaxCategoryId",
649        default,
650        skip_serializing_if = "Option::is_none"
651    )]
652    pub automatic_tax_category_id: Option<String>,
653    /// Is the product label enabled. If this is true, label object cannot be empty.
654    #[serde(
655        rename = "isLabelEnabled",
656        default,
657        skip_serializing_if = "Option::is_none"
658    )]
659    pub is_label_enabled: Option<bool>,
660    /// Details for Product Label
661    #[serde(default, skip_serializing_if = "Option::is_none")]
662    pub label: Option<ProductLabelDto>,
663    /// The slug using which the product navigation will be handled
664    #[serde(default, skip_serializing_if = "Option::is_none")]
665    pub slug: Option<String>,
666    /// SEO data for the product that will be displayed in the preview
667    #[serde(default, skip_serializing_if = "Option::is_none")]
668    pub seo: Option<ProductSEODto>,
669    /// Whether the taxes should be included in the purchase price
670    #[serde(
671        rename = "taxInclusive",
672        default,
673        skip_serializing_if = "Option::is_none"
674    )]
675    pub tax_inclusive: Option<bool>,
676}
677
678/// `CreateProductResponseDto` from the GoHighLevel OpenAPI spec.
679#[derive(Debug, Clone, Default, Serialize, Deserialize)]
680pub struct CreateProductResponseDto {
681    /// The unique identifier for the product.
682    /// Required by the API.
683    #[serde(rename = "_id")]
684    pub id: String,
685    /// product description
686    #[serde(default, skip_serializing_if = "Option::is_none")]
687    pub description: Option<String>,
688    /// An array of variants for the product.
689    #[serde(default, skip_serializing_if = "Vec::is_empty")]
690    pub variants: Vec<ProductVariantDto>,
691    /// The unique identifier for the location.
692    /// Required by the API.
693    #[serde(rename = "locationId")]
694    pub location_id: String,
695    /// The name of the product.
696    /// Required by the API.
697    pub name: String,
698    /// The type of the product (e.g., PHYSICAL).
699    /// Required by the API.
700    #[serde(rename = "productType")]
701    pub product_type: String,
702    /// Indicates whether the product is available in-store.
703    #[serde(
704        rename = "availableInStore",
705        default,
706        skip_serializing_if = "Option::is_none"
707    )]
708    pub available_in_store: Option<bool>,
709    /// The creation timestamp of the product.
710    /// Format: date-time (ISO-8601 string).
711    /// Required by the API.
712    #[serde(rename = "createdAt")]
713    pub created_at: String,
714    /// The last update timestamp of the product.
715    /// Format: date-time (ISO-8601 string).
716    /// Required by the API.
717    #[serde(rename = "updatedAt")]
718    pub updated_at: String,
719    /// The statement descriptor for the product.
720    #[serde(
721        rename = "statementDescriptor",
722        default,
723        skip_serializing_if = "Option::is_none"
724    )]
725    pub statement_descriptor: Option<String>,
726    /// The URL for the product image.
727    #[serde(default, skip_serializing_if = "Option::is_none")]
728    pub image: Option<String>,
729    /// An array of category Ids for the product
730    #[serde(
731        rename = "collectionIds",
732        default,
733        skip_serializing_if = "Vec::is_empty"
734    )]
735    pub collection_ids: Vec<String>,
736    /// The field indicates whether taxes are enabled for the product or not.
737    #[serde(
738        rename = "isTaxesEnabled",
739        default,
740        skip_serializing_if = "Option::is_none"
741    )]
742    pub is_taxes_enabled: Option<bool>,
743    /// An array of ids of Taxes attached to the Product. If the expand query includes tax, the
744    /// taxes will be of type `ProductTaxDto`. Please refer to the `ProductTaxDto` for
745    /// additional details.
746    #[serde(default, skip_serializing_if = "Vec::is_empty")]
747    pub taxes: Vec<String>,
748    /// Tax category ID for Automatic taxes calculation.
749    #[serde(
750        rename = "automaticTaxCategoryId",
751        default,
752        skip_serializing_if = "Option::is_none"
753    )]
754    pub automatic_tax_category_id: Option<String>,
755    /// The Product label details
756    #[serde(default, skip_serializing_if = "Option::is_none")]
757    pub label: Option<ProductLabelDto>,
758    /// The slug of the product by which the product will be navigated
759    #[serde(default, skip_serializing_if = "Option::is_none")]
760    pub slug: Option<String>,
761}
762
763/// `DefaultCollectionResponseDto` from the GoHighLevel OpenAPI spec.
764#[derive(Debug, Clone, Default, Serialize, Deserialize)]
765pub struct DefaultCollectionResponseDto {
766    /// Collection Data
767    /// Required by the API.
768    pub data: ProductCategories,
769    /// Status of the operation
770    /// Required by the API.
771    pub status: bool,
772}
773
774/// `DefaultPriceResponseDto` from the GoHighLevel OpenAPI spec.
775#[derive(Debug, Clone, Default, Serialize, Deserialize)]
776pub struct DefaultPriceResponseDto {
777    /// The unique identifier for the price.
778    /// Required by the API.
779    #[serde(rename = "_id")]
780    pub id: String,
781    /// An array of membership offers associated with the price.
782    #[serde(
783        rename = "membershipOffers",
784        default,
785        skip_serializing_if = "Vec::is_empty"
786    )]
787    pub membership_offers: Vec<MembershipOfferDto>,
788    /// An array of variant option IDs associated with the price.
789    #[serde(
790        rename = "variantOptionIds",
791        default,
792        skip_serializing_if = "Vec::is_empty"
793    )]
794    pub variant_option_ids: Vec<String>,
795    /// The unique identifier for the location.
796    #[serde(
797        rename = "locationId",
798        default,
799        skip_serializing_if = "Option::is_none"
800    )]
801    pub location_id: Option<String>,
802    /// The unique identifier for the associated product.
803    #[serde(default, skip_serializing_if = "Option::is_none")]
804    pub product: Option<String>,
805    /// The unique identifier for the user.
806    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
807    pub user_id: Option<String>,
808    /// The name of the price.
809    /// Required by the API.
810    pub name: String,
811    /// The type of the price (e.g., one_time).
812    /// Allowed values: `one_time`, `recurring`.
813    /// Required by the API.
814    #[serde(rename = "type")]
815    pub type_: String,
816    /// The currency code for the price.
817    /// Required by the API.
818    pub currency: String,
819    /// The amount of the price.
820    /// Required by the API.
821    pub amount: f64,
822    /// The recurring details of the price (if type is recurring).
823    #[serde(default, skip_serializing_if = "Option::is_none")]
824    pub recurring: Option<RecurringDto>,
825    /// The creation timestamp of the price.
826    /// Format: date-time (ISO-8601 string).
827    #[serde(rename = "createdAt", default, skip_serializing_if = "Option::is_none")]
828    pub created_at: Option<String>,
829    /// The last update timestamp of the price.
830    /// Format: date-time (ISO-8601 string).
831    #[serde(rename = "updatedAt", default, skip_serializing_if = "Option::is_none")]
832    pub updated_at: Option<String>,
833    /// The compare-at price for comparison purposes.
834    #[serde(
835        rename = "compareAtPrice",
836        default,
837        skip_serializing_if = "Option::is_none"
838    )]
839    pub compare_at_price: Option<f64>,
840    /// Indicates whether inventory tracking is enabled.
841    #[serde(
842        rename = "trackInventory",
843        default,
844        skip_serializing_if = "Option::is_none"
845    )]
846    pub track_inventory: Option<bool>,
847    /// Available inventory stock quantity
848    #[serde(
849        rename = "availableQuantity",
850        default,
851        skip_serializing_if = "Option::is_none"
852    )]
853    pub available_quantity: Option<f64>,
854    /// Continue selling when out of stock
855    #[serde(
856        rename = "allowOutOfStockPurchases",
857        default,
858        skip_serializing_if = "Option::is_none"
859    )]
860    pub allow_out_of_stock_purchases: Option<bool>,
861}
862
863/// `DefaultProductResponseDto` from the GoHighLevel OpenAPI spec.
864#[derive(Debug, Clone, Default, Serialize, Deserialize)]
865pub struct DefaultProductResponseDto {
866    /// The unique identifier for the product.
867    /// Required by the API.
868    #[serde(rename = "_id")]
869    pub id: String,
870    /// product description
871    #[serde(default, skip_serializing_if = "Option::is_none")]
872    pub description: Option<String>,
873    /// An array of variants for the product.
874    #[serde(default, skip_serializing_if = "Vec::is_empty")]
875    pub variants: Vec<ProductVariantDto>,
876    /// The unique identifier for the location.
877    /// Required by the API.
878    #[serde(rename = "locationId")]
879    pub location_id: String,
880    /// The name of the product.
881    /// Required by the API.
882    pub name: String,
883    /// The type of the product (e.g., PHYSICAL).
884    /// Required by the API.
885    #[serde(rename = "productType")]
886    pub product_type: String,
887    /// Indicates whether the product is available in-store.
888    #[serde(
889        rename = "availableInStore",
890        default,
891        skip_serializing_if = "Option::is_none"
892    )]
893    pub available_in_store: Option<bool>,
894    /// The creation timestamp of the product.
895    /// Format: date-time (ISO-8601 string).
896    /// Required by the API.
897    #[serde(rename = "createdAt")]
898    pub created_at: String,
899    /// The last update timestamp of the product.
900    /// Format: date-time (ISO-8601 string).
901    /// Required by the API.
902    #[serde(rename = "updatedAt")]
903    pub updated_at: String,
904    /// The statement descriptor for the product.
905    #[serde(
906        rename = "statementDescriptor",
907        default,
908        skip_serializing_if = "Option::is_none"
909    )]
910    pub statement_descriptor: Option<String>,
911    /// The URL for the product image.
912    #[serde(default, skip_serializing_if = "Option::is_none")]
913    pub image: Option<String>,
914    /// An array of category Ids for the product
915    #[serde(
916        rename = "collectionIds",
917        default,
918        skip_serializing_if = "Vec::is_empty"
919    )]
920    pub collection_ids: Vec<String>,
921    /// The field indicates whether taxes are enabled for the product or not.
922    #[serde(
923        rename = "isTaxesEnabled",
924        default,
925        skip_serializing_if = "Option::is_none"
926    )]
927    pub is_taxes_enabled: Option<bool>,
928    /// An array of ids of Taxes attached to the Product. If the expand query includes tax, the
929    /// taxes will be of type `ProductTaxDto`. Please refer to the `ProductTaxDto` for
930    /// additional details.
931    #[serde(default, skip_serializing_if = "Vec::is_empty")]
932    pub taxes: Vec<String>,
933    /// Tax category ID for Automatic taxes calculation.
934    #[serde(
935        rename = "automaticTaxCategoryId",
936        default,
937        skip_serializing_if = "Option::is_none"
938    )]
939    pub automatic_tax_category_id: Option<String>,
940    /// The Product label details
941    #[serde(default, skip_serializing_if = "Option::is_none")]
942    pub label: Option<ProductLabelDto>,
943    /// The slug of the product by which the product will be navigated
944    #[serde(default, skip_serializing_if = "Option::is_none")]
945    pub slug: Option<String>,
946}
947
948/// `DeletePriceResponseDto` from the GoHighLevel OpenAPI spec.
949#[derive(Debug, Clone, Default, Serialize, Deserialize)]
950pub struct DeletePriceResponseDto {
951    /// returns true if the price is successfully deleted
952    /// Required by the API.
953    pub status: bool,
954}
955
956/// `DeleteProductCollectionResponseDto` from the GoHighLevel OpenAPI spec.
957#[derive(Debug, Clone, Default, Serialize, Deserialize)]
958pub struct DeleteProductCollectionResponseDto {
959    /// Status of api action
960    /// Required by the API.
961    pub status: bool,
962    /// Success message
963    #[serde(default, skip_serializing_if = "Option::is_none")]
964    pub message: Option<String>,
965}
966
967/// `DeleteProductResponseDto` from the GoHighLevel OpenAPI spec.
968#[derive(Debug, Clone, Default, Serialize, Deserialize)]
969pub struct DeleteProductResponseDto {
970    /// returns true if the product is successfully deleted
971    /// Required by the API.
972    pub status: bool,
973}
974
975/// `DeleteProductReviewResponseDto` from the GoHighLevel OpenAPI spec.
976#[derive(Debug, Clone, Default, Serialize, Deserialize)]
977pub struct DeleteProductReviewResponseDto {
978    /// Status of api action
979    /// Required by the API.
980    pub status: bool,
981    /// Success message
982    #[serde(default, skip_serializing_if = "Option::is_none")]
983    pub message: Option<String>,
984}
985
986/// `GetInventoryResponseDto` from the GoHighLevel OpenAPI spec.
987#[derive(Debug, Clone, Default, Serialize, Deserialize)]
988pub struct GetInventoryResponseDto {
989    /// List of inventory items
990    /// Required by the API.
991    #[serde(default, skip_serializing_if = "Vec::is_empty")]
992    pub inventory: Vec<InventoryItemDto>,
993    /// Total count of inventory items
994    /// Required by the API.
995    pub total: serde_json::Value,
996}
997
998/// `GetPriceResponseDto` from the GoHighLevel OpenAPI spec.
999#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1000pub struct GetPriceResponseDto {
1001    /// The unique identifier for the price.
1002    /// Required by the API.
1003    #[serde(rename = "_id")]
1004    pub id: String,
1005    /// An array of membership offers associated with the price.
1006    #[serde(
1007        rename = "membershipOffers",
1008        default,
1009        skip_serializing_if = "Vec::is_empty"
1010    )]
1011    pub membership_offers: Vec<MembershipOfferDto>,
1012    /// An array of variant option IDs associated with the price.
1013    #[serde(
1014        rename = "variantOptionIds",
1015        default,
1016        skip_serializing_if = "Vec::is_empty"
1017    )]
1018    pub variant_option_ids: Vec<String>,
1019    /// The unique identifier for the location.
1020    #[serde(
1021        rename = "locationId",
1022        default,
1023        skip_serializing_if = "Option::is_none"
1024    )]
1025    pub location_id: Option<String>,
1026    /// The unique identifier for the associated product.
1027    #[serde(default, skip_serializing_if = "Option::is_none")]
1028    pub product: Option<String>,
1029    /// The unique identifier for the user.
1030    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
1031    pub user_id: Option<String>,
1032    /// The name of the price.
1033    /// Required by the API.
1034    pub name: String,
1035    /// The type of the price (e.g., one_time).
1036    /// Allowed values: `one_time`, `recurring`.
1037    /// Required by the API.
1038    #[serde(rename = "type")]
1039    pub type_: String,
1040    /// The currency code for the price.
1041    /// Required by the API.
1042    pub currency: String,
1043    /// The amount of the price.
1044    /// Required by the API.
1045    pub amount: f64,
1046    /// The recurring details of the price (if type is recurring).
1047    #[serde(default, skip_serializing_if = "Option::is_none")]
1048    pub recurring: Option<RecurringDto>,
1049    /// The creation timestamp of the price.
1050    /// Format: date-time (ISO-8601 string).
1051    #[serde(rename = "createdAt", default, skip_serializing_if = "Option::is_none")]
1052    pub created_at: Option<String>,
1053    /// The last update timestamp of the price.
1054    /// Format: date-time (ISO-8601 string).
1055    #[serde(rename = "updatedAt", default, skip_serializing_if = "Option::is_none")]
1056    pub updated_at: Option<String>,
1057    /// The compare-at price for comparison purposes.
1058    #[serde(
1059        rename = "compareAtPrice",
1060        default,
1061        skip_serializing_if = "Option::is_none"
1062    )]
1063    pub compare_at_price: Option<f64>,
1064    /// Indicates whether inventory tracking is enabled.
1065    #[serde(
1066        rename = "trackInventory",
1067        default,
1068        skip_serializing_if = "Option::is_none"
1069    )]
1070    pub track_inventory: Option<bool>,
1071    /// Available inventory stock quantity
1072    #[serde(
1073        rename = "availableQuantity",
1074        default,
1075        skip_serializing_if = "Option::is_none"
1076    )]
1077    pub available_quantity: Option<f64>,
1078    /// Continue selling when out of stock
1079    #[serde(
1080        rename = "allowOutOfStockPurchases",
1081        default,
1082        skip_serializing_if = "Option::is_none"
1083    )]
1084    pub allow_out_of_stock_purchases: Option<bool>,
1085}
1086
1087/// `GetProductResponseDto` from the GoHighLevel OpenAPI spec.
1088#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1089pub struct GetProductResponseDto {
1090    /// The unique identifier for the product.
1091    /// Required by the API.
1092    #[serde(rename = "_id")]
1093    pub id: String,
1094    /// product description
1095    #[serde(default, skip_serializing_if = "Option::is_none")]
1096    pub description: Option<String>,
1097    /// An array of variants for the product.
1098    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1099    pub variants: Vec<ProductVariantDto>,
1100    /// The unique identifier for the location.
1101    /// Required by the API.
1102    #[serde(rename = "locationId")]
1103    pub location_id: String,
1104    /// The name of the product.
1105    /// Required by the API.
1106    pub name: String,
1107    /// The type of the product (e.g., PHYSICAL).
1108    /// Required by the API.
1109    #[serde(rename = "productType")]
1110    pub product_type: String,
1111    /// Indicates whether the product is available in-store.
1112    #[serde(
1113        rename = "availableInStore",
1114        default,
1115        skip_serializing_if = "Option::is_none"
1116    )]
1117    pub available_in_store: Option<bool>,
1118    /// The creation timestamp of the product.
1119    /// Format: date-time (ISO-8601 string).
1120    /// Required by the API.
1121    #[serde(rename = "createdAt")]
1122    pub created_at: String,
1123    /// The last update timestamp of the product.
1124    /// Format: date-time (ISO-8601 string).
1125    /// Required by the API.
1126    #[serde(rename = "updatedAt")]
1127    pub updated_at: String,
1128    /// The statement descriptor for the product.
1129    #[serde(
1130        rename = "statementDescriptor",
1131        default,
1132        skip_serializing_if = "Option::is_none"
1133    )]
1134    pub statement_descriptor: Option<String>,
1135    /// The URL for the product image.
1136    #[serde(default, skip_serializing_if = "Option::is_none")]
1137    pub image: Option<String>,
1138    /// An array of category Ids for the product
1139    #[serde(
1140        rename = "collectionIds",
1141        default,
1142        skip_serializing_if = "Vec::is_empty"
1143    )]
1144    pub collection_ids: Vec<String>,
1145    /// The field indicates whether taxes are enabled for the product or not.
1146    #[serde(
1147        rename = "isTaxesEnabled",
1148        default,
1149        skip_serializing_if = "Option::is_none"
1150    )]
1151    pub is_taxes_enabled: Option<bool>,
1152    /// An array of ids of Taxes attached to the Product. If the expand query includes tax, the
1153    /// taxes will be of type `ProductTaxDto`. Please refer to the `ProductTaxDto` for
1154    /// additional details.
1155    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1156    pub taxes: Vec<String>,
1157    /// Tax category ID for Automatic taxes calculation.
1158    #[serde(
1159        rename = "automaticTaxCategoryId",
1160        default,
1161        skip_serializing_if = "Option::is_none"
1162    )]
1163    pub automatic_tax_category_id: Option<String>,
1164    /// The Product label details
1165    #[serde(default, skip_serializing_if = "Option::is_none")]
1166    pub label: Option<ProductLabelDto>,
1167    /// The slug of the product by which the product will be navigated
1168    #[serde(default, skip_serializing_if = "Option::is_none")]
1169    pub slug: Option<String>,
1170}
1171
1172/// `GetProductStatsResponseDto` from the GoHighLevel OpenAPI spec.
1173#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1174pub struct GetProductStatsResponseDto {
1175    /// Total number of products
1176    /// Required by the API.
1177    #[serde(rename = "totalProducts")]
1178    pub total_products: f64,
1179    /// Number of products included in the store
1180    /// Required by the API.
1181    #[serde(rename = "includedInStore")]
1182    pub included_in_store: f64,
1183    /// Number of products excluded from the store
1184    /// Required by the API.
1185    #[serde(rename = "excludedFromStore")]
1186    pub excluded_from_store: f64,
1187}
1188
1189/// `InventoryItemDto` from the GoHighLevel OpenAPI spec.
1190#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1191pub struct InventoryItemDto {
1192    /// The unique identifier for the price
1193    /// Required by the API.
1194    #[serde(rename = "_id")]
1195    pub id: String,
1196    /// Name of the price/variant
1197    /// Required by the API.
1198    pub name: String,
1199    /// Available quantity in inventory
1200    /// Required by the API.
1201    #[serde(rename = "availableQuantity")]
1202    pub available_quantity: f64,
1203    /// SKU for the product variant
1204    /// Required by the API.
1205    pub sku: String,
1206    /// Whether out of stock purchases are allowed
1207    /// Required by the API.
1208    #[serde(rename = "allowOutOfStockPurchases")]
1209    pub allow_out_of_stock_purchases: bool,
1210    /// Product ID this price belongs to
1211    /// Required by the API.
1212    pub product: String,
1213    /// Last update timestamp
1214    /// Required by the API.
1215    #[serde(rename = "updatedAt")]
1216    pub updated_at: String,
1217    /// Product image URL
1218    #[serde(default, skip_serializing_if = "Option::is_none")]
1219    pub image: Option<String>,
1220    /// Product name
1221    #[serde(
1222        rename = "productName",
1223        default,
1224        skip_serializing_if = "Option::is_none"
1225    )]
1226    pub product_name: Option<String>,
1227}
1228
1229/// `ListCollectionResponseDto` from the GoHighLevel OpenAPI spec.
1230#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1231pub struct ListCollectionResponseDto {
1232    /// Array of Collections
1233    /// Required by the API.
1234    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1235    pub data: Vec<Vec<serde_json::Value>>,
1236    /// The total count of the collections present, which is useful to calculate the pagination
1237    /// Required by the API.
1238    pub total: f64,
1239}
1240
1241/// `ListPricesResponseDto` from the GoHighLevel OpenAPI spec.
1242#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1243pub struct ListPricesResponseDto {
1244    /// An array of prices
1245    /// Required by the API.
1246    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1247    pub prices: Vec<DefaultPriceResponseDto>,
1248    /// Required by the API.
1249    pub total: f64,
1250}
1251
1252/// `ListProductReviewsResponseDto` from the GoHighLevel OpenAPI spec.
1253#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1254pub struct ListProductReviewsResponseDto {
1255    /// Array of Collections
1256    /// Required by the API.
1257    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1258    pub data: Vec<Vec<serde_json::Value>>,
1259    /// The total count of the collections present, which is useful to calculate the pagination
1260    /// Required by the API.
1261    pub total: f64,
1262}
1263
1264/// `ListProductsResponseDto` from the GoHighLevel OpenAPI spec.
1265#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1266pub struct ListProductsResponseDto {
1267    /// An array of products
1268    /// Required by the API.
1269    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1270    pub products: Vec<DefaultProductResponseDto>,
1271    /// list products status
1272    /// Required by the API.
1273    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1274    pub total: Vec<ListProductsStats>,
1275}
1276
1277/// `ListProductsStats` from the GoHighLevel OpenAPI spec.
1278#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1279pub struct ListProductsStats {
1280    /// Total number of products
1281    /// Required by the API.
1282    pub total: f64,
1283}
1284
1285/// `MembershipOfferDto` from the GoHighLevel OpenAPI spec.
1286#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1287pub struct MembershipOfferDto {
1288    /// Membership offer label
1289    /// Required by the API.
1290    pub label: String,
1291    /// Membership offer label
1292    /// Required by the API.
1293    pub value: String,
1294    /// The unique identifier for the membership offer.
1295    /// Required by the API.
1296    #[serde(rename = "_id")]
1297    pub id: String,
1298}
1299
1300/// `PriceDimensionsDto` from the GoHighLevel OpenAPI spec.
1301#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1302pub struct PriceDimensionsDto {
1303    /// Height of the price
1304    /// Required by the API.
1305    pub height: f64,
1306    /// Width of the price
1307    /// Required by the API.
1308    pub width: f64,
1309    /// Length of the price
1310    /// Required by the API.
1311    pub length: f64,
1312    /// Unit of the price dimensions
1313    /// Allowed values: `cm`, `in`, `m`.
1314    /// Required by the API.
1315    pub unit: String,
1316}
1317
1318/// `PriceMetaDto` from the GoHighLevel OpenAPI spec.
1319#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1320pub struct PriceMetaDto {
1321    /// The source of the price.
1322    /// Allowed values: `stripe`, `woocommerce`, `shopify`.
1323    /// Required by the API.
1324    pub source: String,
1325    /// The id of the source of the price from where it is imported
1326    #[serde(rename = "sourceId", default, skip_serializing_if = "Option::is_none")]
1327    pub source_id: Option<String>,
1328    /// The Stripe price ID associated with the price.
1329    /// Required by the API.
1330    #[serde(rename = "stripePriceId")]
1331    pub stripe_price_id: String,
1332    /// The internal source of the price.
1333    /// Allowed values: `agency_plan`, `funnel`, `membership`, `communities`, `gokollab`,
1334    /// `calendar`.
1335    /// Required by the API.
1336    #[serde(rename = "internalSource")]
1337    pub internal_source: String,
1338}
1339
1340/// `PriceUpdateField` from the GoHighLevel OpenAPI spec.
1341#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1342pub struct PriceUpdateField {
1343    /// Type of price update
1344    /// Allowed values: `INCREASE_BY_AMOUNT`, `REDUCE_BY_AMOUNT`, `SET_NEW_PRICE`,
1345    /// `INCREASE_BY_PERCENTAGE`, `REDUCE_BY_PERCENTAGE`.
1346    /// Required by the API.
1347    #[serde(rename = "type")]
1348    pub type_: String,
1349    /// Value to update (amount or percentage based on type)
1350    /// Required by the API.
1351    pub value: f64,
1352    /// Round to nearest whole number
1353    #[serde(
1354        rename = "roundToWhole",
1355        default,
1356        skip_serializing_if = "Option::is_none"
1357    )]
1358    pub round_to_whole: Option<bool>,
1359}
1360
1361/// `ProductCategories` from the GoHighLevel OpenAPI spec.
1362#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1363pub struct ProductCategories {
1364    /// The spec defines no fields for this schema.
1365    #[serde(flatten)]
1366    pub extra: serde_json::Map<String, serde_json::Value>,
1367}
1368
1369/// `ProductLabelDto` from the GoHighLevel OpenAPI spec.
1370#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1371pub struct ProductLabelDto {
1372    /// The content for the product label.
1373    /// Required by the API.
1374    pub title: String,
1375    /// Start date in YYYY-MM-DDTHH:mm:ssZ format
1376    #[serde(rename = "startDate", default, skip_serializing_if = "Option::is_none")]
1377    pub start_date: Option<String>,
1378    /// Start date in YYYY-MM-DDTHH:mm:ssZ format
1379    #[serde(rename = "endDate", default, skip_serializing_if = "Option::is_none")]
1380    pub end_date: Option<String>,
1381}
1382
1383/// `ProductMediaDto` from the GoHighLevel OpenAPI spec.
1384#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1385pub struct ProductMediaDto {
1386    /// The unique identifier for the media.
1387    /// Required by the API.
1388    pub id: String,
1389    /// The title of the media file.
1390    #[serde(default, skip_serializing_if = "Option::is_none")]
1391    pub title: Option<String>,
1392    /// The URL where the media file is stored.
1393    /// Required by the API.
1394    pub url: String,
1395    /// The type of the media file (e.g., image, video will be supporting soon).
1396    /// Allowed values: `image`, `video`.
1397    /// Required by the API.
1398    #[serde(rename = "type")]
1399    pub type_: String,
1400    /// Indicates whether the media is featured.
1401    #[serde(
1402        rename = "isFeatured",
1403        default,
1404        skip_serializing_if = "Option::is_none"
1405    )]
1406    pub is_featured: Option<bool>,
1407    /// Mongo ObjectIds of the prices for which the media is assigned
1408    #[serde(rename = "priceIds", default, skip_serializing_if = "Vec::is_empty")]
1409    pub price_ids: Vec<Vec<serde_json::Value>>,
1410}
1411
1412/// `ProductReviewDto` from the GoHighLevel OpenAPI spec.
1413#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1414pub struct ProductReviewDto {
1415    /// Headline of the Review
1416    /// Required by the API.
1417    pub headline: String,
1418    /// Detailed Review of the product
1419    /// Required by the API.
1420    pub comment: String,
1421    /// User who is giving the review/reply
1422    /// Required by the API.
1423    pub user: UserDetailsDto,
1424}
1425
1426/// `ProductSEODto` from the GoHighLevel OpenAPI spec.
1427#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1428pub struct ProductSEODto {
1429    /// SEO title
1430    #[serde(default, skip_serializing_if = "Option::is_none")]
1431    pub title: Option<String>,
1432    /// SEO description
1433    #[serde(default, skip_serializing_if = "Option::is_none")]
1434    pub description: Option<String>,
1435}
1436
1437/// `ProductVariantDto` from the GoHighLevel OpenAPI spec.
1438#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1439pub struct ProductVariantDto {
1440    /// A unique identifier for the variant.
1441    /// Required by the API.
1442    pub id: String,
1443    /// The name of the variant.
1444    /// Required by the API.
1445    pub name: String,
1446    /// An array of options for the variant.
1447    /// Required by the API.
1448    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1449    pub options: Vec<ProductVariantOptionDto>,
1450}
1451
1452/// `ProductVariantOptionDto` from the GoHighLevel OpenAPI spec.
1453#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1454pub struct ProductVariantOptionDto {
1455    /// The unique identifier for the option.
1456    /// Required by the API.
1457    pub id: String,
1458    /// The name of the option.
1459    /// Required by the API.
1460    pub name: String,
1461}
1462
1463/// `RecurringDto` from the GoHighLevel OpenAPI spec.
1464#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1465pub struct RecurringDto {
1466    /// The interval at which the recurring event occurs.
1467    /// Allowed values: `day`, `month`, `week`, `year`.
1468    /// Required by the API.
1469    pub interval: String,
1470    /// The number of intervals between each occurrence of the event.
1471    /// Required by the API.
1472    #[serde(rename = "intervalCount")]
1473    pub interval_count: f64,
1474}
1475
1476/// `ShippingOptionsDto` from the GoHighLevel OpenAPI spec.
1477#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1478pub struct ShippingOptionsDto {
1479    /// Weight options of the product
1480    #[serde(default, skip_serializing_if = "Option::is_none")]
1481    pub weight: Option<WeightOptionsDto>,
1482    /// Dimensions of the product
1483    #[serde(default, skip_serializing_if = "Option::is_none")]
1484    pub dimensions: Option<PriceDimensionsDto>,
1485}
1486
1487/// `UpdateDisplayPriorityBodyDto` from the GoHighLevel OpenAPI spec.
1488#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1489pub struct UpdateDisplayPriorityBodyDto {
1490    /// Location Id or Agency Id
1491    /// Required by the API.
1492    #[serde(rename = "altId")]
1493    pub alt_id: String,
1494    /// Allowed values: `location`.
1495    /// Required by the API.
1496    #[serde(rename = "altType")]
1497    pub alt_type: String,
1498    /// Array of products with their display priorities
1499    /// Required by the API.
1500    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1501    pub products: Vec<Vec<serde_json::Value>>,
1502}
1503
1504/// `UpdateInventoryDto` from the GoHighLevel OpenAPI spec.
1505#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1506pub struct UpdateInventoryDto {
1507    /// Location Id or Agency Id
1508    /// Required by the API.
1509    #[serde(rename = "altId")]
1510    pub alt_id: String,
1511    /// Allowed values: `location`.
1512    /// Required by the API.
1513    #[serde(rename = "altType")]
1514    pub alt_type: String,
1515    /// Array of items to update in the inventory.
1516    /// Required by the API.
1517    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1518    pub items: Vec<UpdateInventoryItemDto>,
1519}
1520
1521/// `UpdateInventoryItemDto` from the GoHighLevel OpenAPI spec.
1522#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1523pub struct UpdateInventoryItemDto {
1524    /// The unique identifier for the price, in MongoDB ID format.
1525    /// Required by the API.
1526    #[serde(rename = "priceId")]
1527    pub price_id: String,
1528    /// The available quantity of the item.
1529    #[serde(
1530        rename = "availableQuantity",
1531        default,
1532        skip_serializing_if = "Option::is_none"
1533    )]
1534    pub available_quantity: Option<f64>,
1535    /// Whether to continue selling the item when out of stock.
1536    #[serde(
1537        rename = "allowOutOfStockPurchases",
1538        default,
1539        skip_serializing_if = "Option::is_none"
1540    )]
1541    pub allow_out_of_stock_purchases: Option<bool>,
1542}
1543
1544/// `UpdateInventoryResponseDto` from the GoHighLevel OpenAPI spec.
1545#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1546pub struct UpdateInventoryResponseDto {
1547    /// Status of api action
1548    /// Required by the API.
1549    pub status: bool,
1550    /// Success message
1551    #[serde(default, skip_serializing_if = "Option::is_none")]
1552    pub message: Option<String>,
1553}
1554
1555/// `UpdatePriceDto` from the GoHighLevel OpenAPI spec.
1556#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1557pub struct UpdatePriceDto {
1558    /// The name of the price.
1559    /// Required by the API.
1560    pub name: String,
1561    /// The type of the price.
1562    /// Allowed values: `one_time`, `recurring`.
1563    /// Required by the API.
1564    #[serde(rename = "type")]
1565    pub type_: String,
1566    /// The currency of the price.
1567    /// Required by the API.
1568    pub currency: String,
1569    /// The amount of the price. ( min: 0 )
1570    /// Required by the API.
1571    pub amount: f64,
1572    /// The recurring details of the price (if type is recurring).
1573    #[serde(default, skip_serializing_if = "Option::is_none")]
1574    pub recurring: Option<RecurringDto>,
1575    /// A brief description of the price.
1576    #[serde(default, skip_serializing_if = "Option::is_none")]
1577    pub description: Option<String>,
1578    /// An array of membership offers associated with the price.
1579    #[serde(
1580        rename = "membershipOffers",
1581        default,
1582        skip_serializing_if = "Vec::is_empty"
1583    )]
1584    pub membership_offers: Vec<MembershipOfferDto>,
1585    /// The trial period duration in days (if applicable).
1586    #[serde(
1587        rename = "trialPeriod",
1588        default,
1589        skip_serializing_if = "Option::is_none"
1590    )]
1591    pub trial_period: Option<f64>,
1592    /// The total number of billing cycles for the price. ( min: 1 )
1593    #[serde(
1594        rename = "totalCycles",
1595        default,
1596        skip_serializing_if = "Option::is_none"
1597    )]
1598    pub total_cycles: Option<f64>,
1599    /// The setup fee for the price.
1600    #[serde(rename = "setupFee", default, skip_serializing_if = "Option::is_none")]
1601    pub setup_fee: Option<f64>,
1602    /// An array of variant option IDs associated with the price.
1603    #[serde(
1604        rename = "variantOptionIds",
1605        default,
1606        skip_serializing_if = "Vec::is_empty"
1607    )]
1608    pub variant_option_ids: Vec<String>,
1609    /// The compare at price for the price.
1610    #[serde(
1611        rename = "compareAtPrice",
1612        default,
1613        skip_serializing_if = "Option::is_none"
1614    )]
1615    pub compare_at_price: Option<f64>,
1616    /// The unique identifier of the location associated with the price.
1617    /// Required by the API.
1618    #[serde(rename = "locationId")]
1619    pub location_id: String,
1620    /// The unique identifier of the user who created the price.
1621    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
1622    pub user_id: Option<String>,
1623    /// Additional metadata associated with the price.
1624    #[serde(default, skip_serializing_if = "Option::is_none")]
1625    pub meta: Option<PriceMetaDto>,
1626    /// Need to track inventory stock quantity
1627    #[serde(
1628        rename = "trackInventory",
1629        default,
1630        skip_serializing_if = "Option::is_none"
1631    )]
1632    pub track_inventory: Option<bool>,
1633    /// Available inventory stock quantity
1634    #[serde(
1635        rename = "availableQuantity",
1636        default,
1637        skip_serializing_if = "Option::is_none"
1638    )]
1639    pub available_quantity: Option<f64>,
1640    /// Continue selling when out of stock
1641    #[serde(
1642        rename = "allowOutOfStockPurchases",
1643        default,
1644        skip_serializing_if = "Option::is_none"
1645    )]
1646    pub allow_out_of_stock_purchases: Option<bool>,
1647    /// The unique identifier of the SKU associated with the price
1648    #[serde(default, skip_serializing_if = "Option::is_none")]
1649    pub sku: Option<String>,
1650    /// Shipping options of the Price
1651    #[serde(
1652        rename = "shippingOptions",
1653        default,
1654        skip_serializing_if = "Option::is_none"
1655    )]
1656    pub shipping_options: Option<ShippingOptionsDto>,
1657    /// Is the product a digital product
1658    #[serde(
1659        rename = "isDigitalProduct",
1660        default,
1661        skip_serializing_if = "Option::is_none"
1662    )]
1663    pub is_digital_product: Option<bool>,
1664    /// Digital delivery options
1665    #[serde(
1666        rename = "digitalDelivery",
1667        default,
1668        skip_serializing_if = "Vec::is_empty"
1669    )]
1670    pub digital_delivery: Vec<String>,
1671}
1672
1673/// `UpdatePriceResponseDto` from the GoHighLevel OpenAPI spec.
1674#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1675pub struct UpdatePriceResponseDto {
1676    /// The unique identifier for the price.
1677    /// Required by the API.
1678    #[serde(rename = "_id")]
1679    pub id: String,
1680    /// An array of membership offers associated with the price.
1681    #[serde(
1682        rename = "membershipOffers",
1683        default,
1684        skip_serializing_if = "Vec::is_empty"
1685    )]
1686    pub membership_offers: Vec<MembershipOfferDto>,
1687    /// An array of variant option IDs associated with the price.
1688    #[serde(
1689        rename = "variantOptionIds",
1690        default,
1691        skip_serializing_if = "Vec::is_empty"
1692    )]
1693    pub variant_option_ids: Vec<String>,
1694    /// The unique identifier for the location.
1695    #[serde(
1696        rename = "locationId",
1697        default,
1698        skip_serializing_if = "Option::is_none"
1699    )]
1700    pub location_id: Option<String>,
1701    /// The unique identifier for the associated product.
1702    #[serde(default, skip_serializing_if = "Option::is_none")]
1703    pub product: Option<String>,
1704    /// The unique identifier for the user.
1705    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
1706    pub user_id: Option<String>,
1707    /// The name of the price.
1708    /// Required by the API.
1709    pub name: String,
1710    /// The type of the price (e.g., one_time).
1711    /// Allowed values: `one_time`, `recurring`.
1712    /// Required by the API.
1713    #[serde(rename = "type")]
1714    pub type_: String,
1715    /// The currency code for the price.
1716    /// Required by the API.
1717    pub currency: String,
1718    /// The amount of the price.
1719    /// Required by the API.
1720    pub amount: f64,
1721    /// The recurring details of the price (if type is recurring).
1722    #[serde(default, skip_serializing_if = "Option::is_none")]
1723    pub recurring: Option<RecurringDto>,
1724    /// The creation timestamp of the price.
1725    /// Format: date-time (ISO-8601 string).
1726    #[serde(rename = "createdAt", default, skip_serializing_if = "Option::is_none")]
1727    pub created_at: Option<String>,
1728    /// The last update timestamp of the price.
1729    /// Format: date-time (ISO-8601 string).
1730    #[serde(rename = "updatedAt", default, skip_serializing_if = "Option::is_none")]
1731    pub updated_at: Option<String>,
1732    /// The compare-at price for comparison purposes.
1733    #[serde(
1734        rename = "compareAtPrice",
1735        default,
1736        skip_serializing_if = "Option::is_none"
1737    )]
1738    pub compare_at_price: Option<f64>,
1739    /// Indicates whether inventory tracking is enabled.
1740    #[serde(
1741        rename = "trackInventory",
1742        default,
1743        skip_serializing_if = "Option::is_none"
1744    )]
1745    pub track_inventory: Option<bool>,
1746    /// Available inventory stock quantity
1747    #[serde(
1748        rename = "availableQuantity",
1749        default,
1750        skip_serializing_if = "Option::is_none"
1751    )]
1752    pub available_quantity: Option<f64>,
1753    /// Continue selling when out of stock
1754    #[serde(
1755        rename = "allowOutOfStockPurchases",
1756        default,
1757        skip_serializing_if = "Option::is_none"
1758    )]
1759    pub allow_out_of_stock_purchases: Option<bool>,
1760}
1761
1762/// `UpdateProductCollectionResponseDto` from the GoHighLevel OpenAPI spec.
1763#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1764pub struct UpdateProductCollectionResponseDto {
1765    /// Status of api action
1766    /// Required by the API.
1767    pub status: bool,
1768    /// Success message
1769    #[serde(default, skip_serializing_if = "Option::is_none")]
1770    pub message: Option<String>,
1771}
1772
1773/// `UpdateProductCollectionsDto` from the GoHighLevel OpenAPI spec.
1774#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1775pub struct UpdateProductCollectionsDto {
1776    /// Location Id
1777    /// Required by the API.
1778    #[serde(rename = "altId")]
1779    pub alt_id: String,
1780    /// The type of alt. For now it is only LOCATION
1781    /// Allowed values: `location`.
1782    /// Required by the API.
1783    #[serde(rename = "altType")]
1784    pub alt_type: String,
1785    /// Name of the Product Collection
1786    #[serde(default, skip_serializing_if = "Option::is_none")]
1787    pub name: Option<String>,
1788    /// Slug of the Product Collection which helps in navigation
1789    #[serde(default, skip_serializing_if = "Option::is_none")]
1790    pub slug: Option<String>,
1791    /// The URL of the image that is going to be displayed as the collection Thumbnail
1792    #[serde(default, skip_serializing_if = "Option::is_none")]
1793    pub image: Option<String>,
1794    /// The metadata information which will be displayed in SEO previews
1795    #[serde(default, skip_serializing_if = "Option::is_none")]
1796    pub seo: Option<CollectionSEODto>,
1797}
1798
1799/// `UpdateProductDto` from the GoHighLevel OpenAPI spec.
1800#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1801pub struct UpdateProductDto {
1802    /// The name of the product.
1803    /// Required by the API.
1804    pub name: String,
1805    /// The unique identifier for the location.
1806    /// Required by the API.
1807    #[serde(rename = "locationId")]
1808    pub location_id: String,
1809    /// A brief description of the product.
1810    #[serde(default, skip_serializing_if = "Option::is_none")]
1811    pub description: Option<String>,
1812    /// Allowed values: `DIGITAL`, `PHYSICAL`, `SERVICE`, `PHYSICAL/DIGITAL`.
1813    /// Required by the API.
1814    #[serde(rename = "productType")]
1815    pub product_type: String,
1816    /// The URL for the product image.
1817    #[serde(default, skip_serializing_if = "Option::is_none")]
1818    pub image: Option<String>,
1819    /// The statement descriptor for the product.
1820    #[serde(
1821        rename = "statementDescriptor",
1822        default,
1823        skip_serializing_if = "Option::is_none"
1824    )]
1825    pub statement_descriptor: Option<String>,
1826    /// Indicates whether the product is available in-store.
1827    #[serde(
1828        rename = "availableInStore",
1829        default,
1830        skip_serializing_if = "Option::is_none"
1831    )]
1832    pub available_in_store: Option<bool>,
1833    /// An array of medias for the product.
1834    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1835    pub medias: Vec<ProductMediaDto>,
1836    /// An array of variants for the product.
1837    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1838    pub variants: Vec<ProductVariantDto>,
1839    /// An array of category Ids for the product
1840    #[serde(
1841        rename = "collectionIds",
1842        default,
1843        skip_serializing_if = "Vec::is_empty"
1844    )]
1845    pub collection_ids: Vec<String>,
1846    /// Are there any taxes attached to the product. If this is true, taxes array cannot be
1847    /// empty.
1848    #[serde(
1849        rename = "isTaxesEnabled",
1850        default,
1851        skip_serializing_if = "Option::is_none"
1852    )]
1853    pub is_taxes_enabled: Option<bool>,
1854    /// List of ids of Taxes attached to the Product. If taxes are passed, isTaxesEnabled should
1855    /// be true.
1856    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1857    pub taxes: Vec<String>,
1858    /// Tax category ID for Automatic taxes calculation.
1859    #[serde(
1860        rename = "automaticTaxCategoryId",
1861        default,
1862        skip_serializing_if = "Option::is_none"
1863    )]
1864    pub automatic_tax_category_id: Option<String>,
1865    /// Is the product label enabled. If this is true, label object cannot be empty.
1866    #[serde(
1867        rename = "isLabelEnabled",
1868        default,
1869        skip_serializing_if = "Option::is_none"
1870    )]
1871    pub is_label_enabled: Option<bool>,
1872    /// Details for Product Label
1873    #[serde(default, skip_serializing_if = "Option::is_none")]
1874    pub label: Option<ProductLabelDto>,
1875    /// The slug using which the product navigation will be handled
1876    #[serde(default, skip_serializing_if = "Option::is_none")]
1877    pub slug: Option<String>,
1878    /// SEO data for the product that will be displayed in the preview
1879    #[serde(default, skip_serializing_if = "Option::is_none")]
1880    pub seo: Option<ProductSEODto>,
1881    /// Whether the taxes should be included in the purchase price
1882    #[serde(
1883        rename = "taxInclusive",
1884        default,
1885        skip_serializing_if = "Option::is_none"
1886    )]
1887    pub tax_inclusive: Option<bool>,
1888    /// The prices of the product
1889    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1890    pub prices: Vec<String>,
1891}
1892
1893/// `UpdateProductResponseDto` from the GoHighLevel OpenAPI spec.
1894#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1895pub struct UpdateProductResponseDto {
1896    /// The unique identifier for the product.
1897    /// Required by the API.
1898    #[serde(rename = "_id")]
1899    pub id: String,
1900    /// product description
1901    #[serde(default, skip_serializing_if = "Option::is_none")]
1902    pub description: Option<String>,
1903    /// An array of variants for the product.
1904    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1905    pub variants: Vec<ProductVariantDto>,
1906    /// The unique identifier for the location.
1907    /// Required by the API.
1908    #[serde(rename = "locationId")]
1909    pub location_id: String,
1910    /// The name of the product.
1911    /// Required by the API.
1912    pub name: String,
1913    /// The type of the product (e.g., PHYSICAL).
1914    /// Required by the API.
1915    #[serde(rename = "productType")]
1916    pub product_type: String,
1917    /// Indicates whether the product is available in-store.
1918    #[serde(
1919        rename = "availableInStore",
1920        default,
1921        skip_serializing_if = "Option::is_none"
1922    )]
1923    pub available_in_store: Option<bool>,
1924    /// The creation timestamp of the product.
1925    /// Format: date-time (ISO-8601 string).
1926    /// Required by the API.
1927    #[serde(rename = "createdAt")]
1928    pub created_at: String,
1929    /// The last update timestamp of the product.
1930    /// Format: date-time (ISO-8601 string).
1931    /// Required by the API.
1932    #[serde(rename = "updatedAt")]
1933    pub updated_at: String,
1934    /// The statement descriptor for the product.
1935    #[serde(
1936        rename = "statementDescriptor",
1937        default,
1938        skip_serializing_if = "Option::is_none"
1939    )]
1940    pub statement_descriptor: Option<String>,
1941    /// The URL for the product image.
1942    #[serde(default, skip_serializing_if = "Option::is_none")]
1943    pub image: Option<String>,
1944    /// An array of category Ids for the product
1945    #[serde(
1946        rename = "collectionIds",
1947        default,
1948        skip_serializing_if = "Vec::is_empty"
1949    )]
1950    pub collection_ids: Vec<String>,
1951    /// The field indicates whether taxes are enabled for the product or not.
1952    #[serde(
1953        rename = "isTaxesEnabled",
1954        default,
1955        skip_serializing_if = "Option::is_none"
1956    )]
1957    pub is_taxes_enabled: Option<bool>,
1958    /// An array of ids of Taxes attached to the Product. If the expand query includes tax, the
1959    /// taxes will be of type `ProductTaxDto`. Please refer to the `ProductTaxDto` for
1960    /// additional details.
1961    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1962    pub taxes: Vec<String>,
1963    /// Tax category ID for Automatic taxes calculation.
1964    #[serde(
1965        rename = "automaticTaxCategoryId",
1966        default,
1967        skip_serializing_if = "Option::is_none"
1968    )]
1969    pub automatic_tax_category_id: Option<String>,
1970    /// The Product label details
1971    #[serde(default, skip_serializing_if = "Option::is_none")]
1972    pub label: Option<ProductLabelDto>,
1973    /// The slug of the product by which the product will be navigated
1974    #[serde(default, skip_serializing_if = "Option::is_none")]
1975    pub slug: Option<String>,
1976}
1977
1978/// `UpdateProductReviewDto` from the GoHighLevel OpenAPI spec.
1979#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1980pub struct UpdateProductReviewDto {
1981    /// Location Id or Agency Id
1982    /// Required by the API.
1983    #[serde(rename = "altId")]
1984    pub alt_id: String,
1985    /// Allowed values: `location`.
1986    /// Required by the API.
1987    #[serde(rename = "altType")]
1988    pub alt_type: String,
1989    /// Product Id
1990    /// Required by the API.
1991    #[serde(rename = "productId")]
1992    pub product_id: String,
1993    /// Status of the review
1994    /// Required by the API.
1995    pub status: String,
1996    /// Reply of the review
1997    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1998    pub reply: Vec<ProductReviewDto>,
1999    /// Rating of the product
2000    #[serde(default, skip_serializing_if = "Option::is_none")]
2001    pub rating: Option<f64>,
2002    /// Headline of the Review
2003    #[serde(default, skip_serializing_if = "Option::is_none")]
2004    pub headline: Option<String>,
2005    /// Detailed Review of the product
2006    #[serde(default, skip_serializing_if = "Option::is_none")]
2007    pub detail: Option<String>,
2008}
2009
2010/// `UpdateProductReviewObjectDto` from the GoHighLevel OpenAPI spec.
2011#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2012pub struct UpdateProductReviewObjectDto {
2013    /// Review Id
2014    /// Required by the API.
2015    #[serde(rename = "reviewId")]
2016    pub review_id: String,
2017    /// Product Id
2018    /// Required by the API.
2019    #[serde(rename = "productId")]
2020    pub product_id: String,
2021    /// Store Id
2022    /// Required by the API.
2023    #[serde(rename = "storeId")]
2024    pub store_id: String,
2025}
2026
2027/// `UpdateProductReviewsDto` from the GoHighLevel OpenAPI spec.
2028#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2029pub struct UpdateProductReviewsDto {
2030    /// Location Id or Agency Id
2031    /// Required by the API.
2032    #[serde(rename = "altId")]
2033    pub alt_id: String,
2034    /// Allowed values: `location`.
2035    /// Required by the API.
2036    #[serde(rename = "altType")]
2037    pub alt_type: String,
2038    /// Array of Product Reviews
2039    /// Required by the API.
2040    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2041    pub reviews: Vec<UpdateProductReviewObjectDto>,
2042    /// Status of the review
2043    /// Required by the API.
2044    pub status: serde_json::Value,
2045}
2046
2047/// `UpdateProductReviewsResponseDto` from the GoHighLevel OpenAPI spec.
2048#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2049pub struct UpdateProductReviewsResponseDto {
2050    /// Status of api action
2051    /// Required by the API.
2052    pub status: bool,
2053    /// Success message
2054    #[serde(default, skip_serializing_if = "Option::is_none")]
2055    pub message: Option<String>,
2056}
2057
2058/// `UpdateProductStoreDto` from the GoHighLevel OpenAPI spec.
2059#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2060pub struct UpdateProductStoreDto {
2061    /// Location Id or Agency Id
2062    /// Required by the API.
2063    #[serde(rename = "altId")]
2064    pub alt_id: String,
2065    /// Allowed values: `location`.
2066    /// Required by the API.
2067    #[serde(rename = "altType")]
2068    pub alt_type: String,
2069    /// Action to include or exclude the product from the store
2070    /// Allowed values: `include`, `exclude`.
2071    /// Required by the API.
2072    pub action: String,
2073    /// Array of product IDs
2074    /// Required by the API.
2075    #[serde(rename = "productIds", default, skip_serializing_if = "Vec::is_empty")]
2076    pub product_ids: Vec<String>,
2077}
2078
2079/// `UpdateProductStoreResponseDto` from the GoHighLevel OpenAPI spec.
2080#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2081pub struct UpdateProductStoreResponseDto {
2082    /// Status of api action
2083    /// Required by the API.
2084    pub status: bool,
2085    /// Success message
2086    #[serde(default, skip_serializing_if = "Option::is_none")]
2087    pub message: Option<String>,
2088}
2089
2090/// `UserDetailsDto` from the GoHighLevel OpenAPI spec.
2091#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2092pub struct UserDetailsDto {
2093    /// Name of the customer
2094    /// Required by the API.
2095    pub name: String,
2096    /// Email of the customer
2097    /// Required by the API.
2098    pub email: String,
2099    /// Phone no of the customer
2100    #[serde(default, skip_serializing_if = "Option::is_none")]
2101    pub phone: Option<String>,
2102    /// Is the person an admin or customer
2103    #[serde(
2104        rename = "isCustomer",
2105        default,
2106        skip_serializing_if = "Option::is_none"
2107    )]
2108    pub is_customer: Option<bool>,
2109}
2110
2111/// `WeightOptionsDto` from the GoHighLevel OpenAPI spec.
2112#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2113pub struct WeightOptionsDto {
2114    /// Actual weight of the product
2115    /// Required by the API.
2116    pub value: f64,
2117    /// Weight unit of the product
2118    /// Allowed values: `kg`, `lb`, `g`, `oz`.
2119    /// Required by the API.
2120    pub unit: String,
2121}