basic stuff
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
FROM rust:1-bookworm
|
FROM rust:1-bookworm
|
||||||
RUN apt update && apt upgrade -y && apt install fish -y
|
RUN apt update && apt upgrade -y && apt install fish iputils-ping -y
|
||||||
RUN rustup component add clippy rustfmt
|
RUN rustup component add clippy rustfmt
|
||||||
|
|
||||||
RUN useradd -ms /bin/fish vscode
|
RUN useradd -ms /bin/fish vscode
|
||||||
45
.vscode/launch.json
vendored
Normal file
45
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug executable 'iot-cloud'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"--bin=iot-cloud",
|
||||||
|
"--package=iot-cloud"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "iot-cloud",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in executable 'iot-cloud'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--bin=iot-cloud",
|
||||||
|
"--package=iot-cloud"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "iot-cloud",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -7,4 +7,6 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
actix-web = "4.4.0"
|
actix-web = "4.4.0"
|
||||||
sqlx = { version = "0.7", features = [ "runtime-tokio", "tls-rustls", "postgres" ] }
|
env_logger = "0.10.0"
|
||||||
|
log = "0.4.20"
|
||||||
|
sqlx = { version = "0.7", features = [ "runtime-tokio", "tls-rustls", "postgres" ] }
|
||||||
|
|||||||
24
dev.md
Normal file
24
dev.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Tables
|
||||||
|
## Devices
|
||||||
|
- ID
|
||||||
|
- display_name
|
||||||
|
|
||||||
|
|
||||||
|
## Sensor Data
|
||||||
|
- timestamp
|
||||||
|
- value
|
||||||
|
- device_id
|
||||||
|
- errorcode
|
||||||
|
|
||||||
|
## Telemetry
|
||||||
|
- timestamp
|
||||||
|
- Software Version
|
||||||
|
- Voltage
|
||||||
|
- Temperature
|
||||||
|
- uptime
|
||||||
|
|
||||||
|
|
||||||
|
# Endpoints
|
||||||
|
- /telemetry
|
||||||
|
- /values
|
||||||
|
- /ota
|
||||||
50
src/database.rs
Normal file
50
src/database.rs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
use log::{info, error};
|
||||||
|
use sqlx::{pool, postgres::PgPoolOptions, PgPool, Pool, Postgres, query};
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Database {
|
||||||
|
conn_pool: Pool<Postgres>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Database {
|
||||||
|
pub async fn init(host: &str, user: &str, pass: &str, db_name: &str) -> Database {
|
||||||
|
match PgPoolOptions::new()
|
||||||
|
.max_connections(10)
|
||||||
|
.connect(&format!("postgres://{user}:{pass}@{host}/{db_name}"))
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Ok(pool) => {
|
||||||
|
info!("Connection to the database is successful!");
|
||||||
|
Database { conn_pool: pool }
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
error!("Failed to connect to the database: {:?}", err);
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_telementry(&self){
|
||||||
|
info!("Adding telementry")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the necessary tables exist. If not, create them. TODO auto-migration
|
||||||
|
pub async fn init_db(&self){
|
||||||
|
info!("Checking if required tables exist");
|
||||||
|
|
||||||
|
let exists = query!(
|
||||||
|
"SELECT count(*) FROM information_schema.tables WHERE table_name = 'dev';"
|
||||||
|
).fetch_one(&self.conn_pool).await;
|
||||||
|
|
||||||
|
let exist = match exists {
|
||||||
|
Ok(res) => res.count > Some(0),
|
||||||
|
Err(err) => {
|
||||||
|
error!("Error checking table existence: {:?}", err);
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
info!("Table exists: {:?}", exist);
|
||||||
|
}
|
||||||
|
}
|
||||||
39
src/main.rs
39
src/main.rs
@@ -1,19 +1,34 @@
|
|||||||
use actix_web::{get, web, App, HttpServer, Responder};
|
use actix_web::{post, web, App, HttpServer, Responder};
|
||||||
|
use database::Database;
|
||||||
|
use log::info;
|
||||||
|
|
||||||
#[get("/")]
|
mod database;
|
||||||
async fn index() -> impl Responder {
|
|
||||||
"Hello, World!"
|
struct AppState {
|
||||||
|
db: Database,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/{name}")]
|
#[post("/telemetry/{device_id}")]
|
||||||
async fn hello(name: web::Path<String>) -> impl Responder {
|
async fn receive_telemetry(device_id: web::Path<String>, data: web::Data<AppState>) -> impl Responder {
|
||||||
format!("Hello {}!", &name)
|
data.db.add_telementry();
|
||||||
|
format!("Hello {}!", &device_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_web::main]
|
#[actix_web::main]
|
||||||
async fn main() -> std::io::Result<()> {
|
async fn main() -> std::io::Result<()> {
|
||||||
HttpServer::new(|| App::new().service(index).service(hello))
|
env_logger::init();
|
||||||
.bind(("127.0.0.1", 8080))?
|
info!("Starting");
|
||||||
.run()
|
|
||||||
.await
|
info!("Connecting to Database");
|
||||||
}
|
let db = Database::init("db", "dev", "dev", "iot").await;
|
||||||
|
db.init_db().await;
|
||||||
|
|
||||||
|
HttpServer::new(move || {
|
||||||
|
App::new()
|
||||||
|
.app_data(web::Data::new(AppState { db: db.clone() }))
|
||||||
|
.service(receive_telemetry)
|
||||||
|
})
|
||||||
|
.bind(("127.0.0.1", 8080))?
|
||||||
|
.run()
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user