Skip to main content

aster_server/routes/
telemetry.rs

1use aster::posthog::emit_event;
2use axum::{extract::State, http::StatusCode, routing::post, Json, Router};
3use serde::Deserialize;
4use std::collections::HashMap;
5use std::sync::Arc;
6use utoipa::ToSchema;
7
8use crate::state::AppState;
9
10#[derive(Debug, Deserialize, ToSchema)]
11pub struct TelemetryEventRequest {
12    pub event_name: String,
13    #[serde(default)]
14    pub properties: HashMap<String, serde_json::Value>,
15}
16
17#[utoipa::path(
18    post,
19    path = "/telemetry/event",
20    request_body = TelemetryEventRequest,
21    responses(
22        (status = 202, description = "Event accepted for processing")
23    )
24)]
25async fn send_telemetry_event(
26    State(_state): State<Arc<AppState>>,
27    Json(request): Json<TelemetryEventRequest>,
28) -> StatusCode {
29    let event_name = request.event_name;
30    let properties = request.properties;
31
32    tokio::spawn(async move {
33        if let Err(e) = emit_event(&event_name, properties).await {
34            tracing::debug!("Failed to send telemetry event: {}", e);
35        }
36    });
37
38    StatusCode::ACCEPTED
39}
40
41pub fn routes(state: Arc<AppState>) -> Router {
42    Router::new()
43        .route("/telemetry/event", post(send_telemetry_event))
44        .with_state(state)
45}