Implemented Pull OTA json
This commit is contained in:
@@ -1,10 +1,15 @@
|
||||
use actix_web::web;
|
||||
use chrono::Utc;
|
||||
use log::{error, info};
|
||||
use sqlx::{migrate, postgres::PgPoolOptions, query, query_as, types::mac_address::MacAddress, Pool, Postgres};
|
||||
use sqlx::{
|
||||
migrate, postgres::PgPoolOptions, query, query_as, types::mac_address::MacAddress, Pool,
|
||||
Postgres,
|
||||
};
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::schemas::{TelemetryMessage, TelemetryMessageFromDevice, ValueMessageFromDevice, ValueMessage, Device};
|
||||
use crate::schemas::{
|
||||
Device, TelemetryMessage, TelemetryMessageFromDevice, ValueMessage, ValueMessageFromDevice,
|
||||
};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Database {
|
||||
@@ -59,15 +64,26 @@ impl Database {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn add_display_name(&self, device_id: &MacAddress, display_name: &str) -> Result<(), DatabaseError> {
|
||||
pub async fn add_display_name(
|
||||
&self,
|
||||
device_id: &MacAddress,
|
||||
display_name: &str,
|
||||
) -> Result<(), DatabaseError> {
|
||||
info!("Adding Displayname {display_name} to Device with ID {device_id}");
|
||||
query!("UPDATE Devices SET display_name = $1 WHERE id = $2;", display_name, device_id)
|
||||
.execute(&self.conn_pool)
|
||||
.await?;
|
||||
query!(
|
||||
"UPDATE Devices SET display_name = $1 WHERE id = $2;",
|
||||
display_name,
|
||||
device_id
|
||||
)
|
||||
.execute(&self.conn_pool)
|
||||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn create_device_if_not_exists(&self, device_id: &MacAddress) -> Result<(), DatabaseError> {
|
||||
pub async fn create_device_if_not_exists(
|
||||
&self,
|
||||
device_id: &MacAddress,
|
||||
) -> Result<(), DatabaseError> {
|
||||
info!("Checking if device with the ID {} exists", &device_id);
|
||||
let exists_result = query!("SELECT count(*) FROM devices WHERE ID = $1;", device_id)
|
||||
.fetch_one(&self.conn_pool)
|
||||
@@ -130,15 +146,26 @@ impl Database {
|
||||
) -> Result<(), DatabaseError> {
|
||||
info!("Adding value to DB");
|
||||
let current_timestamp = Utc::now().naive_utc();
|
||||
query!("
|
||||
query!(
|
||||
"
|
||||
INSERT INTO values (timestamp, value, device_id, active_errors, value_id)
|
||||
VALUES ($1, $2, $3, $4, $5);",
|
||||
current_timestamp, msg.value, device_id, msg.active_errors, msg.value_id).execute(&self.conn_pool).await?;
|
||||
current_timestamp,
|
||||
msg.value,
|
||||
device_id,
|
||||
msg.active_errors,
|
||||
msg.value_id
|
||||
)
|
||||
.execute(&self.conn_pool)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn get_values_for_id(&self, device_id: &MacAddress) -> Result<Vec<ValueMessage>, DatabaseError> {
|
||||
pub async fn get_values_for_id(
|
||||
&self,
|
||||
device_id: &MacAddress,
|
||||
) -> Result<Vec<ValueMessage>, DatabaseError> {
|
||||
info!("Getting values for {} from DB", &device_id);
|
||||
let values = query_as!(
|
||||
ValueMessage,
|
||||
@@ -175,18 +202,23 @@ mod tests {
|
||||
|
||||
#[sqlx::test]
|
||||
async fn add_device(pool: PgPool) {
|
||||
dotenv().ok();
|
||||
let db = Database::init_from_pool(pool).await;
|
||||
|
||||
let test_device = Device{
|
||||
|
||||
let test_device = Device {
|
||||
display_name: Some("Waterlevel daheim".to_owned()),
|
||||
id: MacAddress::from([0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F])
|
||||
id: MacAddress::from([0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F]),
|
||||
};
|
||||
db.add_device(&MacAddress::from([0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F])).await.unwrap();
|
||||
db.add_display_name(&MacAddress::from([0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F]), "Waterlevel daheim").await.unwrap();
|
||||
db.add_device(&MacAddress::from([0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F]))
|
||||
.await
|
||||
.unwrap();
|
||||
db.add_display_name(
|
||||
&MacAddress::from([0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F]),
|
||||
"Waterlevel daheim",
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let devices = db.get_devices().await.unwrap();
|
||||
assert_eq!(test_device, devices[0]);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user