Skip to main content

highlevel_api/
client.rs

1use std::sync::Arc;
2use crate::{
3    auth::OAuthClient,
4    config::HighLevelConfig,
5    http::HttpClient,
6    storage::{memory::MemoryStorage, SessionStorage},
7    apis::{
8        blogs::BlogsApi,
9        businesses::BusinessesApi,
10        calendars::CalendarsApi,
11        campaigns::CampaignsApi,
12        companies::CompaniesApi,
13        contacts::ContactsApi,
14        conversations::ConversationsApi,
15        courses::CoursesApi,
16        custom_fields::CustomFieldsApi,
17        custom_menus::CustomMenusApi,
18        forms::FormsApi,
19        funnels::FunnelsApi,
20        invoices::InvoicesApi,
21        links::LinksApi,
22        locations::LocationsApi,
23        medias::MediasApi,
24        opportunities::OpportunitiesApi,
25        payments::PaymentsApi,
26        pipelines::PipelinesApi,
27        products::ProductsApi,
28        snapshots::SnapshotsApi,
29        social_planner::SocialPlannerApi,
30        surveys::SurveysApi,
31        tags::TagsApi,
32        users::UsersApi,
33        webhooks::WebhooksApi,
34        workflows::WorkflowsApi,
35    },
36};
37
38/// The main entry point for the HighLevel API SDK.
39///
40/// # Quick start
41///
42/// ```no_run
43/// use highlevel_api::{HighLevel, HighLevelConfig};
44///
45/// #[tokio::main]
46/// async fn main() {
47///     let client = HighLevel::new(HighLevelConfig::new("client_id", "client_secret"));
48///     client.set_access_token("your_access_token").await;
49/// }
50/// ```
51pub struct HighLevel {
52    pub(crate) http: Arc<HttpClient>,
53    pub(crate) config: Arc<HighLevelConfig>,
54    pub(crate) storage: Arc<dyn SessionStorage>,
55}
56
57impl HighLevel {
58    pub fn new(config: HighLevelConfig) -> Self {
59        Self::with_storage(config, Arc::new(MemoryStorage::new()))
60    }
61
62    pub fn with_storage(config: HighLevelConfig, storage: Arc<dyn SessionStorage>) -> Self {
63        let http = Arc::new(HttpClient::new(&config));
64        Self {
65            http,
66            config: Arc::new(config),
67            storage,
68        }
69    }
70
71    /// Set the Bearer token used for all API calls.
72    pub async fn set_access_token(&self, token: impl Into<String>) {
73        self.http.set_token(token.into()).await;
74    }
75
76    /// Returns the current access token, if one has been set.
77    pub async fn access_token(&self) -> Option<String> {
78        self.http.get_token().await
79    }
80
81    pub fn oauth(&self) -> OAuthClient {
82        OAuthClient::new(self.config.clone(), reqwest::Client::new())
83    }
84
85    // ── API accessors ────────────────────────────────────────────────────────
86
87    pub fn blogs(&self) -> BlogsApi { BlogsApi::new(self.http.clone()) }
88    pub fn businesses(&self) -> BusinessesApi { BusinessesApi::new(self.http.clone()) }
89    pub fn calendars(&self) -> CalendarsApi { CalendarsApi::new(self.http.clone()) }
90    pub fn campaigns(&self) -> CampaignsApi { CampaignsApi::new(self.http.clone()) }
91    pub fn companies(&self) -> CompaniesApi { CompaniesApi::new(self.http.clone()) }
92    pub fn contacts(&self) -> ContactsApi { ContactsApi::new(self.http.clone()) }
93    pub fn conversations(&self) -> ConversationsApi { ConversationsApi::new(self.http.clone()) }
94    pub fn courses(&self) -> CoursesApi { CoursesApi::new(self.http.clone()) }
95    pub fn custom_fields(&self) -> CustomFieldsApi { CustomFieldsApi::new(self.http.clone()) }
96    pub fn custom_menus(&self) -> CustomMenusApi { CustomMenusApi::new(self.http.clone()) }
97    pub fn forms(&self) -> FormsApi { FormsApi::new(self.http.clone()) }
98    pub fn funnels(&self) -> FunnelsApi { FunnelsApi::new(self.http.clone()) }
99    pub fn invoices(&self) -> InvoicesApi { InvoicesApi::new(self.http.clone()) }
100    pub fn links(&self) -> LinksApi { LinksApi::new(self.http.clone()) }
101    pub fn locations(&self) -> LocationsApi { LocationsApi::new(self.http.clone()) }
102    pub fn medias(&self) -> MediasApi { MediasApi::new(self.http.clone()) }
103    pub fn opportunities(&self) -> OpportunitiesApi { OpportunitiesApi::new(self.http.clone()) }
104    pub fn payments(&self) -> PaymentsApi { PaymentsApi::new(self.http.clone()) }
105    pub fn pipelines(&self) -> PipelinesApi { PipelinesApi::new(self.http.clone()) }
106    pub fn products(&self) -> ProductsApi { ProductsApi::new(self.http.clone()) }
107    pub fn snapshots(&self) -> SnapshotsApi { SnapshotsApi::new(self.http.clone()) }
108    pub fn social_planner(&self) -> SocialPlannerApi { SocialPlannerApi::new(self.http.clone()) }
109    pub fn surveys(&self) -> SurveysApi { SurveysApi::new(self.http.clone()) }
110    pub fn tags(&self) -> TagsApi { TagsApi::new(self.http.clone()) }
111    pub fn users(&self) -> UsersApi { UsersApi::new(self.http.clone()) }
112    pub fn webhooks(&self) -> WebhooksApi { WebhooksApi::new(self.http.clone()) }
113    pub fn workflows(&self) -> WorkflowsApi { WorkflowsApi::new(self.http.clone()) }
114}