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}