From 3e6a72428824c5a50a873a4284b86d0a9e47a778 Mon Sep 17 00:00:00 2001 From: fx Date: Mon, 9 Oct 2023 17:26:59 +0200 Subject: db int for api --- src/routes/device.rs | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/routes/device.rs (limited to 'src/routes/device.rs') diff --git a/src/routes/device.rs b/src/routes/device.rs new file mode 100644 index 0000000..d5d7144 --- /dev/null +++ b/src/routes/device.rs @@ -0,0 +1,92 @@ +use std::sync::Arc; +use axum::extract::State; +use axum::headers::HeaderMap; +use axum::Json; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; +use crate::auth::auth; +use crate::db::Device; +use crate::error::WebolError; + +pub async fn get_device(State(state): State>, headers: HeaderMap, Json(payload): Json) -> Result, WebolError> { + let secret = headers.get("authorization"); + if auth(secret).map_err(WebolError::Auth)? { + let device = sqlx::query_as!( + Device, + r#" + SELECT id, mac, broadcast_addr + FROM devices + WHERE id = $1; + "#, + payload.id + ).fetch_one(&state.db).await.map_err(|err| WebolError::Server(Box::new(err)))?; + + Ok(Json(json!(device))) + } else { + Err(WebolError::Generic) + } +} + +#[derive(Deserialize)] +pub struct GetDevicePayload { + id: String, +} + +pub async fn put_device(State(state): State>, headers: HeaderMap, Json(payload): Json) -> Result, WebolError> { + let secret = headers.get("authorization"); + if auth(secret).map_err(WebolError::Auth)? { + sqlx::query!( + r#" + INSERT INTO devices (id, mac, broadcast_addr) + VALUES ($1, $2, $3); + "#, + payload.id, + payload.mac, + payload.broadcast_addr + ).execute(&state.db).await.map_err(|err| WebolError::Server(Box::new(err)))?; + + Ok(Json(json!(PutDeviceResponse { success: true }))) + } else { + Err(WebolError::Generic) + } +} + +#[derive(Deserialize)] +pub struct PutDevicePayload { + id: String, + mac: String, + broadcast_addr: String, +} + +#[derive(Serialize)] +pub struct PutDeviceResponse { + success: bool +} + +pub async fn post_device(State(state): State>, headers: HeaderMap, Json(payload): Json) -> Result, WebolError> { + let secret = headers.get("authorization"); + if auth(secret).map_err(WebolError::Auth)? { + let device = sqlx::query_as!( + Device, + r#" + UPDATE devices + SET mac = $1, broadcast_addr = $2 WHERE id = $3 + RETURNING id, mac, broadcast_addr; + "#, + payload.mac, + payload.broadcast_addr, + payload.id + ).fetch_one(&state.db).await.map_err(|err| WebolError::Server(Box::new(err)))?; + + Ok(Json(json!(device))) + } else { + Err(WebolError::Generic) + } +} + +#[derive(Deserialize)] +pub struct PostDevicePayload { + id: String, + mac: String, + broadcast_addr: String, +} \ No newline at end of file -- cgit v1.2.3