86 lines
1.8 KiB
Rust
86 lines
1.8 KiB
Rust
#![feature(proc_macro_hygiene, decl_macro)]
|
|
|
|
#[macro_use]
|
|
extern crate rocket;
|
|
|
|
#[macro_use]
|
|
extern crate rocket_contrib;
|
|
|
|
#[macro_use]
|
|
extern crate anyhow;
|
|
|
|
extern crate chrono;
|
|
|
|
pub mod models;
|
|
pub mod schema;
|
|
|
|
use chrono::prelude::*;
|
|
use rocket::{http::RawStr, State};
|
|
use std::{
|
|
collections::BTreeMap,
|
|
fmt::Display,
|
|
sync::{Arc, Mutex},
|
|
time::{Duration, SystemTime},
|
|
};
|
|
|
|
#[macro_use]
|
|
extern crate diesel;
|
|
extern crate dotenv;
|
|
|
|
use diesel::prelude::*;
|
|
use dotenv::dotenv;
|
|
|
|
use self::models::*;
|
|
|
|
#[database("sqlite_events")]
|
|
struct DbConn(diesel::SqliteConnection);
|
|
|
|
#[get("/")]
|
|
fn index() -> Result<String, anyhow::Error> {
|
|
Ok(format!(
|
|
"Devices:\n{}\n\nwhile true; do curl https://pc.vvn.space/log/name; sleep 5; done",
|
|
"aa"
|
|
))
|
|
}
|
|
|
|
#[get("/log/<device_name>/<value>")]
|
|
fn log_new(device_name: &RawStr, value: &RawStr, conn: DbConn) -> Result<String, anyhow::Error> {
|
|
let new_event = NewEvent {
|
|
devicename: device_name,
|
|
value: value.parse()?,
|
|
timestamp: &Local::now().to_rfc3339(),
|
|
};
|
|
|
|
diesel::insert_into(self::schema::events::table)
|
|
.values(&new_event)
|
|
.execute(&*conn)?;
|
|
|
|
Ok(String::from("Logged"))
|
|
}
|
|
|
|
#[get("/log/<device_name>")]
|
|
fn log_get(device_name: &RawStr, conn: DbConn) -> Result<String, anyhow::Error> {
|
|
use self::schema::events::dsl::*;
|
|
let results = events
|
|
.filter(devicename.eq(device_name.as_str()))
|
|
.load::<Event>(&*conn)?;
|
|
|
|
// convert each result into debug-print lines
|
|
let lines = results
|
|
.into_iter()
|
|
.map(|e| format!("{:?}", e))
|
|
.collect::<Vec<_>>()
|
|
.join("\n");
|
|
|
|
Ok(lines)
|
|
}
|
|
|
|
fn main() {
|
|
rocket::ignite()
|
|
.attach(DbConn::fairing())
|
|
.mount("/", routes![index, log_new, log_get])
|
|
.launch();
|
|
|
|
println!("after");
|
|
}
|