From 8f7072d7e96e4898d5b7b2fe694ee33d0cdf2e42 Mon Sep 17 00:00:00 2001 From: Shadowy Super Coder Date: Tue, 4 Jun 2024 09:21:55 -0600 Subject: [PATCH] metrics wip --- core/startos/src/analytics/mod.rs | 69 ++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/core/startos/src/analytics/mod.rs b/core/startos/src/analytics/mod.rs index 52ca37948..6903ecfe1 100644 --- a/core/startos/src/analytics/mod.rs +++ b/core/startos/src/analytics/mod.rs @@ -1,19 +1,28 @@ use std::net::SocketAddr; use axum::Router; +use chrono::Utc; use futures::future::ready; -use rpc_toolkit::{Context, ParentHandler, Server}; +use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler, Server}; +use sqlx::query; +use ts_rs::TS; use crate::analytics::context::AnalyticsContext; use crate::middleware::cors::Cors; use crate::net::static_server::{bad_request, not_found, server_error}; use crate::net::web_server::WebServer; use crate::rpc_continuations::Guid; +use crate::Error; pub mod context; pub fn analytics_api() -> ParentHandler { - ParentHandler::new() // TODO: FullMetal + ParentHandler::new() + .subcommand("recordMetrics", from_fn_async(record_metrics).no_cli()) + .subcommand( + "recordUserActivity", + from_fn_async(record_user_activity).no_cli(), + ) } pub fn analytics_server_router(ctx: AnalyticsContext) -> Router { @@ -76,3 +85,59 @@ impl WebServer { Self::new(bind, analytics_server_router(ctx)) } } + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +struct MetricsParams { + version: char, + pkg_id: char, +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +struct ActivityParams { + server_id: String, + os_version: String, + arch: String, +} + +async fn record_metrics( + ctx: AnalyticsContext, + MetricsParams { + version, + pkg_id, + }: MetricsParams, +) -> Result<(), Error> { + let pool = ctx.db; + let created_at = Utc::now().to_rfc3339(); + query!( + "INSERT INTO metric (created_at, version, pkg_id) VALUES ($1, $2, $3)", + created_at, + version, + pkg_id + ) + .execute(pool) + .await?; + Ok(()) +} + +async fn record_user_activity( + analytics_ctx: AnalyticsContext, + ActivityParams { server_id, os_version, arch }: ActivityParams, +) -> Result<(), Error> { + let pool = analytics_ctx.db; + let created_at = Utc::now().to_rfc3339(); + + query!("INSERT INTO user_activity (created_at, server_id, os_version, arch) VALUES ($1, $2, $3, $4)", + created_at, + server_id, + os_vers, + arch + ) + .execute(pool) + .await?; + + Ok(()) +}