aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfxqnlr <[email protected]>2024-08-10 21:21:34 +0200
committerfxqnlr <[email protected]>2024-08-10 21:21:34 +0200
commit76c89b47fd74e069f9db73503a5131a5a60b8516 (patch)
tree5c6beb74abe986554b9b56cac4673b8e0c743e92 /src
parent3e8866c07fbd6c2819ff3833e52ede9158a9862d (diff)
downloadwebol-76c89b47fd74e069f9db73503a5131a5a60b8516.tar
webol-76c89b47fd74e069f9db73503a5131a5a60b8516.tar.gz
webol-76c89b47fd74e069f9db73503a5131a5a60b8516.zip
add 'devices' path to request all available devices
Diffstat (limited to 'src')
-rw-r--r--src/main.rs4
-rw-r--r--src/routes.rs1
-rw-r--r--src/routes/devices.rs24
-rw-r--r--src/storage.rs25
4 files changed, 50 insertions, 4 deletions
diff --git a/src/main.rs b/src/main.rs
index b550dd8..edee184 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,6 @@
1use crate::{ 1use crate::{
2 config::Config, 2 config::Config,
3 routes::{device, start, status}, 3 routes::{device, devices, start, status},
4 services::ping::{BroadcastCommand, StatusMap}, 4 services::ping::{BroadcastCommand, StatusMap},
5 storage::Device, 5 storage::Device,
6}; 6};
@@ -36,6 +36,7 @@ mod wol;
36 device::get, 36 device::get,
37 device::post, 37 device::post,
38 device::put, 38 device::put,
39 devices::get,
39 ), 40 ),
40 components( 41 components(
41 schemas( 42 schemas(
@@ -113,6 +114,7 @@ async fn main() -> color_eyre::eyre::Result<()> {
113 .route("/start/:id", post(start::post).get(start::get)) 114 .route("/start/:id", post(start::post).get(start::get))
114 .route("/device", post(device::post).put(device::put)) 115 .route("/device", post(device::post).put(device::put))
115 .route("/device/:id", get(device::get)) 116 .route("/device/:id", get(device::get))
117 .route("/devices", get(devices::get))
116 .route("/status", get(status::status)) 118 .route("/status", get(status::status))
117 .route_layer(from_fn_with_state(shared_state.clone(), auth::auth)) 119 .route_layer(from_fn_with_state(shared_state.clone(), auth::auth))
118 .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", ApiDoc::openapi())) 120 .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", ApiDoc::openapi()))
diff --git a/src/routes.rs b/src/routes.rs
index a72f27b..b6ad590 100644
--- a/src/routes.rs
+++ b/src/routes.rs
@@ -1,3 +1,4 @@
1pub mod start; 1pub mod start;
2pub mod device; 2pub mod device;
3pub mod devices;
3pub mod status; 4pub mod status;
diff --git a/src/routes/devices.rs b/src/routes/devices.rs
new file mode 100644
index 0000000..616441c
--- /dev/null
+++ b/src/routes/devices.rs
@@ -0,0 +1,24 @@
1use crate::error::Error;
2use crate::storage::Device;
3use axum::Json;
4use serde_json::{json, Value};
5use tracing::{debug, info};
6
7#[utoipa::path(
8 get,
9 path = "/devices",
10 responses(
11 (status = 200, description = "Get an array of all `Device`s", body = [Vec<Device>])
12 ),
13 security((), ("api_key" = []))
14)]
15pub async fn get(
16) -> Result<Json<Value>, Error> {
17 info!("get all devices");
18
19 let devices = Device::read_all()?;
20
21 debug!("got devices");
22
23 Ok(Json(json!(devices)))
24}
diff --git a/src/storage.rs b/src/storage.rs
index 90ff1b4..e069875 100644
--- a/src/storage.rs
+++ b/src/storage.rs
@@ -1,5 +1,6 @@
1use std::{ 1use std::{
2 fs::{create_dir_all, File}, 2 ffi::OsStr,
3 fs::{create_dir_all, File, read_dir},
3 io::{Read, Write}, 4 io::{Read, Write},
4 path::Path, 5 path::Path,
5}; 6};
@@ -26,14 +27,14 @@ impl Device {
26 const STORAGE_PATH: &'static str = "devices"; 27 const STORAGE_PATH: &'static str = "devices";
27 28
28 pub fn setup() -> Result<String, Error> { 29 pub fn setup() -> Result<String, Error> {
29 trace!("check for storage at {}", Self::STORAGE_PATH); 30 trace!("check for storage STORAGE_PATH=\"{}\"", Self::STORAGE_PATH);
30 let sp = Path::new(Self::STORAGE_PATH); 31 let sp = Path::new(Self::STORAGE_PATH);
31 if !sp.exists() { 32 if !sp.exists() {
32 warn!("device storage path doesn't exist, creating it"); 33 warn!("device storage path doesn't exist, creating it");
33 create_dir_all(Self::STORAGE_PATH)?; 34 create_dir_all(Self::STORAGE_PATH)?;
34 }; 35 };
35 36
36 debug!("device storage at '{}'", Self::STORAGE_PATH); 37 debug!("device storage STORAGE_PATH=\"{}\"", Self::STORAGE_PATH);
37 38
38 Ok(Self::STORAGE_PATH.to_string()) 39 Ok(Self::STORAGE_PATH.to_string())
39 } 40 }
@@ -49,6 +50,24 @@ impl Device {
49 Ok(dev) 50 Ok(dev)
50 } 51 }
51 52
53 pub fn read_all() -> Result<Vec<Self>, Error> {
54 trace!("attempt to read all files");
55 let st_path = read_dir(Self::STORAGE_PATH)?;
56
57 let mut devices = vec![];
58 for file_path in st_path {
59 let file_path = file_path?;
60 if file_path.path().extension() != Some(OsStr::new("json")) { continue; };
61 let mut file = File::open(file_path.path())?;
62 let mut buf = String::new();
63 file.read_to_string(&mut buf)?;
64 trace!(?file, ?buf, "read successfully from file");
65 devices.push(serde_json::from_str(&buf)?);
66 }
67
68 Ok(devices)
69 }
70
52 pub fn write(&self) -> Result<(), Error> { 71 pub fn write(&self) -> Result<(), Error> {
53 trace!(?self.id, ?self, "attempt to write to file"); 72 trace!(?self.id, ?self, "attempt to write to file");
54 let mut file = File::create(format!("{}/{}.json", Self::STORAGE_PATH, self.id))?; 73 let mut file = File::create(format!("{}/{}.json", Self::STORAGE_PATH, self.id))?;