aster_server/routes/
telemetry.rs1use 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}