From fa029e838a2503eecb0ed6c3a406936369a6315b Mon Sep 17 00:00:00 2001 From: Tobias Maier Date: Sat, 16 Sep 2023 20:06:29 +0000 Subject: [PATCH] updates --- Cargo.toml | 4 +++- build.rs | 5 +++++ migrations/2_telemetry.sql | 4 ++-- src/database.rs | 17 ++++++++++++++++- src/main.rs | 16 ++++++++++++++-- src/schemas.rs | 9 +++++++++ 6 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 build.rs create mode 100644 src/schemas.rs diff --git a/Cargo.toml b/Cargo.toml index 8a7b5d1..5863edb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,10 @@ edition = "2021" [dependencies] actix-web = "4.4.0" +chrono = "0.4.31" env_logger = "0.10.0" log = "0.4.20" -sqlx = { version = "0.7", features = [ "runtime-tokio", "tls-rustls", "postgres", "migrate"] } +serde = "1.0.188" +sqlx = { version = "0.7", features = [ "runtime-tokio", "tls-rustls", "postgres", "migrate", "chrono"] } sqlx-cli = "0.7.1" thiserror = "1.0.48" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..7609593 --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +// generated by `sqlx migrate build-script` +fn main() { + // trigger recompilation when a new migration is added + println!("cargo:rerun-if-changed=migrations"); +} \ No newline at end of file diff --git a/migrations/2_telemetry.sql b/migrations/2_telemetry.sql index 6163d42..10fec21 100644 --- a/migrations/2_telemetry.sql +++ b/migrations/2_telemetry.sql @@ -1,10 +1,10 @@ -- Add migration script here CREATE TABLE Telemetry ( timestamp TIMESTAMP NOT NULL, - Software_Version VARCHAR(255), + Software_Version INT, Voltage FLOAT, Temperature FLOAT, - uptime FLOAT, + uptime INT, device_id CHAR(32), FOREIGN KEY (device_id) REFERENCES Devices(ID) ); \ No newline at end of file diff --git a/src/database.rs b/src/database.rs index 2e2ef50..f560176 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,7 +1,10 @@ -use actix_web::cookie::time::error; +use actix_web::{cookie::time::error, web}; use log::{error, info}; use sqlx::{pool, postgres::PgPoolOptions, query, PgPool, Pool, Postgres, migrate}; use thiserror::Error; +use chrono::Utc; + +use crate::schemas::TelemetryMessage; #[derive(Clone)] pub struct Database { @@ -66,10 +69,22 @@ impl Database { }; if exists{ + info!("Device exists"); Ok(()) } else { + info!("Device does not exist"); self.add_device(device_id).await?; Ok(()) } } + + pub async fn add_telemetry(&self, msg: &web::Json, device_id: &str) -> Result<(), DatabaseError> { + info!("Adding telemetry message to DB"); + let current_timestamp = Utc::now().naive_utc(); + query!("INSERT INTO Telemetry (timestamp, software_version, voltage, temperature, uptime, device_id) + VALUES ($1, $2, $3, $4, $5, $6);", + current_timestamp, msg.version, msg.voltage, msg.temperature, msg.uptime, device_id + ).execute(&self.conn_pool).await?; + Ok(()) + } } diff --git a/src/main.rs b/src/main.rs index 19f5a2f..3d1109f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,10 @@ use actix_web::{post, web, App, HttpServer, Responder, http::StatusCode, HttpResponse}; use database::Database; -use log::info; +use log::{info, error, debug}; +use crate::schemas::TelemetryMessage; mod database; +mod schemas; struct AppState { db: Database, @@ -12,8 +14,18 @@ struct AppState { async fn receive_telemetry( device_id: web::Path, data: web::Data, + telemetry_message: web::Json ) -> impl Responder { - data.db.create_device_if_not_exists(&device_id); + info!("POST - telementry - Processing device id {}", device_id); + match data.db.create_device_if_not_exists(&device_id).await{ + Ok(_) => {}, + Err(e) => { + error!("Error creating new device: {}", e); + return HttpResponse::InternalServerError(); + } + }; + debug!("{:?}", telemetry_message); + data.db.add_telemetry(&telemetry_message, &device_id).await; HttpResponse::Ok() } diff --git a/src/schemas.rs b/src/schemas.rs new file mode 100644 index 0000000..39ef08b --- /dev/null +++ b/src/schemas.rs @@ -0,0 +1,9 @@ +use serde::Deserialize; + +#[derive(Deserialize, Debug)] +pub struct TelemetryMessage { + pub uptime: i32, + pub voltage: Option, + pub temperature: Option, + pub version: i32 +} \ No newline at end of file