Skip to main content

lago_client/queries/
event.rs

1use lago_types::{
2    error::{LagoError, Result},
3    requests::event::{CreateEventRequest, GetEventRequest, ListEventsRequest},
4    responses::event::{CreateEventResponse, GetEventResponse, ListEventsResponse},
5};
6use url::Url;
7
8use crate::client::LagoClient;
9
10impl LagoClient {
11    /// Retrieves a specific event by its transaction ID
12    ///
13    /// # Arguments
14    /// * `request` - The request containing the transaction ID to retrieve
15    ///
16    /// # Returns
17    /// A `Result` containing the event data or an error
18    ///
19    /// # Example
20    /// ```no_run
21    /// use lago_client::LagoClient;
22    /// use lago_types::requests::event::GetEventRequest;
23    ///
24    /// # async fn example() -> lago_types::error::Result<()> {
25    /// let client = LagoClient::from_env()?;
26    /// let request = GetEventRequest::new("transaction_123".to_string());
27    /// let response = client.get_event(request).await?;
28    /// println!("Event code: {}", response.event.code);
29    /// # Ok(())
30    /// # }
31    /// ```
32    pub async fn get_event(&self, request: GetEventRequest) -> Result<GetEventResponse> {
33        let region = self.config.region()?;
34        // URL encode the transaction_id to handle special characters
35        let encoded_transaction_id = urlencoding::encode(&request.transaction_id).into_owned();
36        let url = format!("{}/events/{}", region.endpoint(), encoded_transaction_id);
37
38        self.make_request("GET", &url, None::<&()>).await
39    }
40
41    /// Creates a new usage event
42    ///
43    /// This endpoint is used for transmitting usage measurement events to either
44    /// a designated customer or a specific subscription.
45    ///
46    /// # Arguments
47    /// * `request` - The request containing the event data to create
48    ///
49    /// # Returns
50    /// A `Result` containing the created event acknowledgment or an error
51    ///
52    /// # Example
53    /// ```no_run
54    /// use lago_client::LagoClient;
55    /// use lago_types::requests::event::{CreateEventInput, CreateEventRequest};
56    /// use serde_json::json;
57    ///
58    /// # async fn example() -> lago_types::error::Result<()> {
59    /// let client = LagoClient::from_env()?;
60    /// let event_input = CreateEventInput::for_customer(
61    ///     "transaction_456".to_string(),
62    ///     "customer_123".to_string(),
63    ///     "api_calls".to_string(),
64    /// )
65    /// .with_properties(json!({"calls": 150}));
66    ///
67    /// let request = CreateEventRequest::new(event_input);
68    /// let response = client.create_event(request).await?;
69    /// println!("Event created: {}", response.event.transaction_id);
70    /// # Ok(())
71    /// # }
72    /// ```
73    pub async fn create_event(&self, request: CreateEventRequest) -> Result<CreateEventResponse> {
74        let region = self.config.region()?;
75        let url = format!("{}/events", region.endpoint());
76
77        self.make_request("POST", &url, Some(&request)).await
78    }
79
80    /// Retrieves a list of events with optional filtering parameters
81    ///
82    /// This endpoint is used for retrieving all events, with support for filtering
83    /// by subscription, billable metric code, and timestamp range.
84    ///
85    /// # Arguments
86    /// * `request` - Optional request containing filter and pagination parameters.
87    ///   If `None`, returns all events with default pagination.
88    ///
89    /// # Returns
90    /// A `Result` containing the list of events with pagination metadata or an error
91    ///
92    /// # Example
93    /// ```no_run
94    /// use lago_client::LagoClient;
95    /// use lago_types::requests::event::ListEventsRequest;
96    /// use lago_types::models::PaginationParams;
97    ///
98    /// # async fn example() -> lago_types::error::Result<()> {
99    /// let client = LagoClient::from_env()?;
100    ///
101    /// // List all events
102    /// let events = client.list_events(None).await?;
103    /// println!("Found {} events", events.events.len());
104    ///
105    /// // List events with filters
106    /// let request = ListEventsRequest::new()
107    ///     .with_pagination(PaginationParams::new().with_per_page(50))
108    ///     .with_external_subscription_id("sub_123".to_string())
109    ///     .with_code("api_calls".to_string())
110    ///     .with_timestamp_range(
111    ///         "2024-01-01T00:00:00Z".to_string(),
112    ///         "2024-01-31T23:59:59Z".to_string(),
113    ///     );
114    /// let filtered_events = client.list_events(Some(request)).await?;
115    /// # Ok(())
116    /// # }
117    /// ```
118    pub async fn list_events(
119        &self,
120        request: Option<ListEventsRequest>,
121    ) -> Result<ListEventsResponse> {
122        let request = request.unwrap_or_default();
123        let region = self.config.region()?;
124        let mut url = Url::parse(&format!("{}/events", region.endpoint()))
125            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
126
127        let query_params = request.to_query_params();
128
129        if !query_params.is_empty() {
130            let query_string = query_params
131                .iter()
132                .map(|(k, v)| format!("{k}={v}"))
133                .collect::<Vec<_>>()
134                .join("&");
135            url.set_query(Some(&query_string));
136        }
137
138        self.make_request("GET", url.as_str(), None::<&()>).await
139    }
140}