eyes_subscriber/
http_transport.rs1use async_trait::async_trait;
2use reqwest::Client;
3use url::Url;
4use uuid::Uuid;
5
6use crate::{
7 transport::{Transport, TransportError},
8 EventData,
9};
10
11pub struct HttpTransport {
12 client: Client,
13 url: Url,
14 auth_token: Option<String>,
15}
16
17impl HttpTransport {
18 pub fn new(
19 base_url: Url,
20 org_id: Uuid,
21 app_id: Uuid,
22 auth_token: Option<String>,
23 ) -> Result<Self, TransportError> {
24 let url = base_url
25 .join(&format!("/api/orgs/{}/apps/{}/events", org_id, app_id))
26 .map_err(|e| TransportError::Configuration(format!("Invalid URL: {}", e)))?;
27
28 Ok(Self {
29 client: Client::new(),
30 url,
31 auth_token,
32 })
33 }
34}
35
36#[async_trait]
37impl Transport for HttpTransport {
38 async fn connect(&mut self) -> Result<(), TransportError> {
39 Ok(())
40 }
41
42 async fn send(&mut self, event: EventData) -> Result<(), TransportError> {
43 let mut request = self.client.post(self.url.clone()).json(&event);
44 if let Some(token) = &self.auth_token {
45 request = request.bearer_auth(token);
46 }
47 let response = request
48 .send()
49 .await
50 .map_err(|e| TransportError::Send(format!("HTTP request failed: {}", e)))?;
51
52 if !response.status().is_success() {
53 return Err(TransportError::Send(format!(
54 "Server returned error status: {}",
55 response.status()
56 )));
57 }
58
59 Ok(())
60 }
61
62 async fn close(&mut self) -> Result<(), TransportError> {
63 Ok(())
64 }
65}