basic stuff

This commit is contained in:
2023-09-14 20:01:34 +00:00
parent 0507887dfa
commit 3b2f636e41
7 changed files with 151 additions and 14 deletions

View File

@@ -1,5 +1,5 @@
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 useradd -ms /bin/fish vscode

1
.env Normal file
View File

@@ -0,0 +1 @@
DATABASE_URL=postgres://dev:dev@db/iot

45
.vscode/launch.json vendored Normal file
View 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}"
}
]
}

View File

@@ -7,4 +7,6 @@ edition = "2021"
[dependencies]
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
View 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
View 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);
}
}

View File

@@ -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("/")]
async fn index() -> impl Responder {
"Hello, World!"
mod database;
struct AppState {
db: Database,
}
#[get("/{name}")]
async fn hello(name: web::Path<String>) -> impl Responder {
format!("Hello {}!", &name)
#[post("/telemetry/{device_id}")]
async fn receive_telemetry(device_id: web::Path<String>, data: web::Data<AppState>) -> impl Responder {
data.db.add_telementry();
format!("Hello {}!", &device_id)
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new().service(index).service(hello))
.bind(("127.0.0.1", 8080))?
.run()
.await
}
env_logger::init();
info!("Starting");
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
}