highlevel-api 0.1.0

Unofficial Rust SDK for the GoHighLevel (HighLevel) API
Documentation
use std::sync::Arc;
use crate::{
    auth::OAuthClient,
    config::HighLevelConfig,
    http::HttpClient,
    storage::{memory::MemoryStorage, SessionStorage},
    apis::{
        blogs::BlogsApi,
        businesses::BusinessesApi,
        calendars::CalendarsApi,
        campaigns::CampaignsApi,
        companies::CompaniesApi,
        contacts::ContactsApi,
        conversations::ConversationsApi,
        courses::CoursesApi,
        custom_fields::CustomFieldsApi,
        custom_menus::CustomMenusApi,
        forms::FormsApi,
        funnels::FunnelsApi,
        invoices::InvoicesApi,
        links::LinksApi,
        locations::LocationsApi,
        medias::MediasApi,
        opportunities::OpportunitiesApi,
        payments::PaymentsApi,
        pipelines::PipelinesApi,
        products::ProductsApi,
        snapshots::SnapshotsApi,
        social_planner::SocialPlannerApi,
        surveys::SurveysApi,
        tags::TagsApi,
        users::UsersApi,
        webhooks::WebhooksApi,
        workflows::WorkflowsApi,
    },
};

/// The main entry point for the HighLevel API SDK.
///
/// # Quick start
///
/// ```no_run
/// use highlevel_api::{HighLevel, HighLevelConfig};
///
/// #[tokio::main]
/// async fn main() {
///     let client = HighLevel::new(HighLevelConfig::new("client_id", "client_secret"));
///     client.set_access_token("your_access_token").await;
/// }
/// ```
pub struct HighLevel {
    pub(crate) http: Arc<HttpClient>,
    pub(crate) config: Arc<HighLevelConfig>,
    pub(crate) storage: Arc<dyn SessionStorage>,
}

impl HighLevel {
    pub fn new(config: HighLevelConfig) -> Self {
        Self::with_storage(config, Arc::new(MemoryStorage::new()))
    }

    pub fn with_storage(config: HighLevelConfig, storage: Arc<dyn SessionStorage>) -> Self {
        let http = Arc::new(HttpClient::new(&config));
        Self {
            http,
            config: Arc::new(config),
            storage,
        }
    }

    /// Set the Bearer token used for all API calls.
    pub async fn set_access_token(&self, token: impl Into<String>) {
        self.http.set_token(token.into()).await;
    }

    /// Returns the current access token, if one has been set.
    pub async fn access_token(&self) -> Option<String> {
        self.http.get_token().await
    }

    pub fn oauth(&self) -> OAuthClient {
        OAuthClient::new(self.config.clone(), reqwest::Client::new())
    }

    // ── API accessors ────────────────────────────────────────────────────────

    pub fn blogs(&self) -> BlogsApi { BlogsApi::new(self.http.clone()) }
    pub fn businesses(&self) -> BusinessesApi { BusinessesApi::new(self.http.clone()) }
    pub fn calendars(&self) -> CalendarsApi { CalendarsApi::new(self.http.clone()) }
    pub fn campaigns(&self) -> CampaignsApi { CampaignsApi::new(self.http.clone()) }
    pub fn companies(&self) -> CompaniesApi { CompaniesApi::new(self.http.clone()) }
    pub fn contacts(&self) -> ContactsApi { ContactsApi::new(self.http.clone()) }
    pub fn conversations(&self) -> ConversationsApi { ConversationsApi::new(self.http.clone()) }
    pub fn courses(&self) -> CoursesApi { CoursesApi::new(self.http.clone()) }
    pub fn custom_fields(&self) -> CustomFieldsApi { CustomFieldsApi::new(self.http.clone()) }
    pub fn custom_menus(&self) -> CustomMenusApi { CustomMenusApi::new(self.http.clone()) }
    pub fn forms(&self) -> FormsApi { FormsApi::new(self.http.clone()) }
    pub fn funnels(&self) -> FunnelsApi { FunnelsApi::new(self.http.clone()) }
    pub fn invoices(&self) -> InvoicesApi { InvoicesApi::new(self.http.clone()) }
    pub fn links(&self) -> LinksApi { LinksApi::new(self.http.clone()) }
    pub fn locations(&self) -> LocationsApi { LocationsApi::new(self.http.clone()) }
    pub fn medias(&self) -> MediasApi { MediasApi::new(self.http.clone()) }
    pub fn opportunities(&self) -> OpportunitiesApi { OpportunitiesApi::new(self.http.clone()) }
    pub fn payments(&self) -> PaymentsApi { PaymentsApi::new(self.http.clone()) }
    pub fn pipelines(&self) -> PipelinesApi { PipelinesApi::new(self.http.clone()) }
    pub fn products(&self) -> ProductsApi { ProductsApi::new(self.http.clone()) }
    pub fn snapshots(&self) -> SnapshotsApi { SnapshotsApi::new(self.http.clone()) }
    pub fn social_planner(&self) -> SocialPlannerApi { SocialPlannerApi::new(self.http.clone()) }
    pub fn surveys(&self) -> SurveysApi { SurveysApi::new(self.http.clone()) }
    pub fn tags(&self) -> TagsApi { TagsApi::new(self.http.clone()) }
    pub fn users(&self) -> UsersApi { UsersApi::new(self.http.clone()) }
    pub fn webhooks(&self) -> WebhooksApi { WebhooksApi::new(self.http.clone()) }
    pub fn workflows(&self) -> WorkflowsApi { WorkflowsApi::new(self.http.clone()) }
}