Skip to main content

eyes_subscriber/
http_transport.rs

1use 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}