Переглянути джерело

Create get many route for devices

Lee Morgan 2 місяців тому
батько
коміт
d346286a17

+ 20 - 0
src/controllers/device/get_many.rs

@@ -0,0 +1,20 @@
+use actix_web::{HttpResponse, HttpRequest, web, get};
+use sqlx::PgPool;
+use uuid::Uuid;
+use crate::{
+    app_error::AppError,
+    auth::user_auth,
+    models::device::Device
+};
+
+#[get("/home/{homes_id}/device")]
+pub async fn route(
+    db: web::Data<PgPool>,
+    params: web::Path<String>,
+    req: HttpRequest
+) -> Result<HttpResponse, AppError> {
+    let user = user_auth(&db, &req).await?;
+    let home_id = Uuid::parse_str(&params)?;
+    let devices = Device::find_many(&db, user.id, home_id).await?;
+    Ok(HttpResponse::Ok().json(devices))
+}

+ 1 - 0
src/controllers/device/mod.rs

@@ -1,3 +1,4 @@
 pub mod create;
 pub mod delete;
 pub mod signal;
+pub mod get_many;

+ 20 - 0
src/models/device.rs

@@ -126,4 +126,24 @@ impl Device {
             None => Err(AppError::forbidden("Unauthorized access to device"))
         }
     }
+
+    pub async fn find_many(
+        db: &PgPool,
+        user_id: Uuid,
+        home_id: Uuid
+    ) -> Result<Vec<Device>, AppError> {
+        let devices: Vec<Device> = sqlx::query_as::<_, Device>(
+            "SELECT devices.*
+            FROM devices
+            JOIN users_homes ON users_homes.home_id = devices.home_id
+            WHERE users_homes.user_id = $1
+                AND users_homes.home_id = $2"
+        )
+            .bind(user_id)
+            .bind(home_id)
+            .fetch_all(db)
+            .await?;
+
+        Ok(devices)
+    }
 }

+ 3 - 1
src/routes/device.rs

@@ -2,11 +2,13 @@ use actix_web::web;
 use crate::controllers::device::{
     create,
     delete,
-    signal
+    signal,
+    get_many
 };
 
 pub fn config(cfg: &mut web::ServiceConfig) {
     cfg.service(create::route);
     cfg.service(delete::route);
     cfg.service(signal::route);
+    cfg.service(get_many::route);
 }