Skip to content

Commit 965d910

Browse files
authored
Merge pull request #26 from piotrpdev/OKO-104-User-Camera-Settings
feat: OKO-104 User Camera Settings
2 parents 685fca6 + b282d68 commit 965d910

File tree

22 files changed

+955
-109
lines changed

22 files changed

+955
-109
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,4 @@ static/
3333
backend/rust-toolchain.toml
3434

3535
.embuild
36+
backend/.env

backend/.sqlx/query-b9ef03d8a1a2475dfb3af53e75d603a8466480240a7deed6cd375197c0084b22.json

Lines changed: 56 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/src/db.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub use camera_permission::CameraPermission;
55
pub use camera_permission_user_view::CameraPermissionUserView;
66
pub use camera_permission_view::CameraPermissionView;
77
pub use camera_setting::CameraSetting;
8+
pub use camera_setting::CameraSettingNoMeta;
89
pub use user::User;
910
pub use video::Video;
1011
pub use video_camera_view::VideoCameraView;

backend/src/db/camera_setting.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ pub struct CameraSetting {
1515
pub modified_by: Option<i64>,
1616
}
1717

18+
// TODO: Add from trait for CameraSetting -> CameraSettingNoMeta
19+
// TODO: Use single shared definition for both camera and backend
20+
#[derive(Debug, Clone, Serialize, Deserialize)]
21+
pub struct CameraSettingNoMeta {
22+
pub flashlight_enabled: bool,
23+
pub resolution: String,
24+
pub framerate: i64,
25+
}
26+
1827
pub struct Default {
1928
pub setting_id: i64,
2029
pub flashlight_enabled: bool,
@@ -111,6 +120,22 @@ impl Model for CameraSetting {
111120
}
112121
}
113122

123+
impl CameraSetting {
124+
pub async fn get_for_camera(pool: &SqlitePool, camera_id: i64) -> Result<Self> {
125+
sqlx::query_as!(
126+
CameraSetting,
127+
r#"
128+
SELECT *
129+
FROM camera_settings
130+
WHERE camera_id = ?
131+
"#,
132+
camera_id
133+
)
134+
.fetch_one(pool)
135+
.await
136+
}
137+
}
138+
114139
#[cfg(test)]
115140
mod tests {
116141
use super::*;
@@ -230,4 +255,19 @@ mod tests {
230255

231256
Ok(())
232257
}
258+
259+
#[sqlx::test(fixtures(
260+
path = "../../fixtures",
261+
scripts("users", "cameras", "camera_settings")
262+
))]
263+
async fn get_for_camera(pool: SqlitePool) -> Result<()> {
264+
let camera_id = 1;
265+
266+
let returned_settings = CameraSetting::get_for_camera(&pool, camera_id).await?;
267+
268+
assert_eq!(returned_settings.setting_id, 1);
269+
assert_eq!(returned_settings.camera_id, camera_id);
270+
271+
Ok(())
272+
}
233273
}

backend/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
22

3-
pub use crate::web::{App, ImageContainer};
3+
pub use crate::web::{ApiChannelMessage, App, ImageContainer};
44

55
mod db;
66
mod users;
77
mod web;
88

99
pub use {
1010
db::Camera, db::CameraPermission, db::CameraPermissionUserView, db::CameraPermissionView,
11-
db::CameraSetting, db::Model, db::User, db::Video, db::VideoCameraView,
11+
db::CameraSetting, db::CameraSettingNoMeta, db::Model, db::User, db::Video,
12+
db::VideoCameraView,
1213
};
1314

1415
pub async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {

backend/src/users.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ pub struct Credentials {
1515
pub password: String,
1616
}
1717

18-
// TODO: Make db private again and pass db state to Router as layer
18+
// TODO: Make db private again and pass db state to Router as layer/state
1919
#[derive(Debug, Clone)]
2020
pub struct Backend {
2121
pub db: SqlitePool,

backend/src/web.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
11
pub use app::App;
22
pub use app::ImageContainer;
3+
use serde::Deserialize;
4+
use serde::Serialize;
5+
6+
use crate::CameraSettingNoMeta;
7+
8+
// TODO: Use single shared definition for both camera and backend
9+
#[derive(Serialize, Deserialize, Debug, Clone)]
10+
pub enum CameraMessage {
11+
SettingChanged(CameraSettingNoMeta),
12+
Restart,
13+
}
14+
15+
#[derive(Serialize, Deserialize, Debug, Clone)]
16+
pub enum ApiChannelMessage {
17+
CameraRelated {
18+
camera_id: i64,
19+
message: CameraMessage,
20+
},
21+
Initial,
22+
}
323

424
mod app;
525
mod auth;

0 commit comments

Comments
 (0)