From 61ad88a2584254f79b42aa56f9e39183a4e38aee Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 4 Apr 2025 01:48:27 +0000 Subject: [PATCH 1/3] First model change (#23) Reviewed-on: https://git.kundeng.us/phoenix/icarus_models/pulls/23 Co-authored-by: phoenix Co-committed-by: phoenix --- Cargo.toml | 4 +++- src/access_level.rs | 16 ++++++++-------- src/album.rs | 6 ++---- src/coverart.rs | 2 +- src/lib.rs | 22 ++++++++++++++++++++++ src/login_result.rs | 4 ++-- src/song.rs | 27 ++++++++++----------------- src/token.rs | 4 ++-- src/user.rs | 12 +++++------- 9 files changed, 55 insertions(+), 42 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4189aef..585bb1e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus_models" -version = "0.2.0" +version = "0.3.0" edition = "2024" description = "models used for the icarus project" license = "MIT" @@ -9,4 +9,6 @@ license = "MIT" serde = { version = "1.0.218", features = ["derive"] } serde_json = { version = "1.0.139" } rand = { version = "0.9" } +uuid = { version = "1.16.0", features = ["v4", "serde"] } +[dev-dependencies] tempfile = { version = "3.19.1" } diff --git a/src/access_level.rs b/src/access_level.rs index c41d81f..a51dcef 100644 --- a/src/access_level.rs +++ b/src/access_level.rs @@ -4,34 +4,34 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct AccessLevel { - pub id: i32, + pub id: uuid::Uuid, pub level: String, - pub song_id: i32, + pub song_id: uuid::Uuid, } impl Default for AccessLevel { fn default() -> Self { AccessLevel { - id: -1, + id: uuid::Uuid::new_v4(), level: String::new(), - song_id: -1, + song_id: uuid::Uuid::new_v4(), } } } pub fn default_level() -> AccessLevel { AccessLevel { - id: -1, + id: uuid::Uuid::new_v4(), level: String::from("Public"), - song_id: -1, + song_id: uuid::Uuid::new_v4(), } } pub fn private_level() -> AccessLevel { AccessLevel { - id: -1, + id: uuid::Uuid::new_v4(), level: String::from("Private"), - song_id: -1, + song_id: uuid::Uuid::new_v4(), } } diff --git a/src/album.rs b/src/album.rs index 356d23b..bd17c75 100644 --- a/src/album.rs +++ b/src/album.rs @@ -5,9 +5,7 @@ pub mod collection { use std::fs::File; use std::io::BufReader; - fn is_set(num: &i32) -> bool { - *num >= 0 - } + use crate::init; pub fn parse_album(filepath: &String) -> Result { let file = File::open(filepath).expect("Failed to open file"); @@ -27,7 +25,7 @@ pub mod collection { pub genre: String, pub year: i32, pub track_count: i32, - #[serde(skip_serializing_if = "is_set")] + #[serde(skip_serializing_if = "init::is_set")] pub disc_count: i32, #[serde(skip_serializing_if = "Vec::is_empty")] pub tracks: Vec, diff --git a/src/coverart.rs b/src/coverart.rs index 16ffdf8..ebbf013 100644 --- a/src/coverart.rs +++ b/src/coverart.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct CoverArt { - pub id: i32, + pub id: uuid::Uuid, pub title: String, pub path: String, pub data: Vec, diff --git a/src/lib.rs b/src/lib.rs index 43c2c79..e328cf2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,3 +7,25 @@ pub mod song; pub mod token; pub mod types; pub mod user; + +pub mod init { + pub fn is_id_valid(num: &i32) -> bool { + *num > 0 + } + + pub fn is_uuid_nil(uuid: &uuid::Uuid) -> bool { + uuid.is_nil() + } + + pub fn is_zero(num: &i32) -> bool { + *num == 0 + } + + pub fn is_dur_not_set(num: &i32) -> bool { + *num == 0 + } + + pub fn is_set(num: &i32) -> bool { + *num >= 0 + } +} diff --git a/src/login_result.rs b/src/login_result.rs index 782ca77..c4b6740 100644 --- a/src/login_result.rs +++ b/src/login_result.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct LoginResult { - pub id: i32, + pub id: uuid::Uuid, pub username: String, pub token: String, #[serde(alias = "token_type")] @@ -15,7 +15,7 @@ pub struct LoginResult { impl Default for LoginResult { fn default() -> Self { LoginResult { - id: -1, + id: uuid::Uuid::new_v4(), username: String::new(), token: String::new(), token_type: String::new(), diff --git a/src/song.rs b/src/song.rs index 3f0d15f..bf277ff 100644 --- a/src/song.rs +++ b/src/song.rs @@ -1,6 +1,7 @@ use std::io::Read; use crate::constants; +use crate::init; use crate::types; use rand::Rng; @@ -8,9 +9,9 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct Song { - #[serde(skip_serializing_if = "is_zero")] + #[serde(skip_serializing_if = "init::is_uuid_nil")] #[serde(alias = "id")] - pub id: i32, + pub id: uuid::Uuid, #[serde(skip_serializing_if = "String::is_empty")] pub title: String, #[serde(skip_serializing_if = "String::is_empty")] @@ -21,17 +22,17 @@ pub struct Song { pub album_artist: String, #[serde(skip_serializing_if = "String::is_empty")] pub genre: String, - #[serde(skip_serializing_if = "is_zero")] + #[serde(skip_serializing_if = "init::is_zero")] pub year: i32, - #[serde(skip_serializing_if = "is_dur_not_set")] + #[serde(skip_serializing_if = "init::is_dur_not_set")] pub duration: i32, - #[serde(skip_serializing_if = "is_zero")] + #[serde(skip_serializing_if = "init::is_zero")] pub track: i32, - #[serde(skip_serializing_if = "is_zero")] + #[serde(skip_serializing_if = "init::is_zero")] pub disc: i32, - #[serde(skip_serializing_if = "is_zero")] + #[serde(skip_serializing_if = "init::is_zero")] pub disc_count: i32, - #[serde(skip_serializing_if = "is_zero")] + #[serde(skip_serializing_if = "init::is_zero")] pub track_count: i32, #[serde(skip_serializing_if = "String::is_empty")] pub audio_type: String, @@ -39,7 +40,7 @@ pub struct Song { pub date_created: String, #[serde(skip_serializing_if = "String::is_empty")] pub filename: String, - #[serde(skip_serializing_if = "is_zero")] + #[serde(skip_serializing_if = "init::is_zero")] pub user_id: i32, #[serde(skip)] pub data: Vec, @@ -55,14 +56,6 @@ pub struct Song { // pub coverart_id: i32, } -fn is_zero(num: &i32) -> bool { - *num == 0 -} - -fn is_dur_not_set(num: &i32) -> bool { - *num == 0 -} - impl Song { pub fn to_metadata_json(&self, pretty: bool) -> Result { if pretty { diff --git a/src/token.rs b/src/token.rs index dc5a261..fd8f6f7 100644 --- a/src/token.rs +++ b/src/token.rs @@ -13,8 +13,8 @@ pub struct Token { #[derive(Clone, Debug, Deserialize, Serialize)] pub struct AccessToken { - #[serde(alias = "user_id")] - pub user_id: i32, + #[serde(alias = "init::is_uuid_nil")] + pub user_id: uuid::Uuid, #[serde(alias = "username")] pub username: String, #[serde(alias = "token")] diff --git a/src/user.rs b/src/user.rs index 07f2a59..6efeb3c 100644 --- a/src/user.rs +++ b/src/user.rs @@ -1,11 +1,13 @@ use std::default::Default; +use crate::init; + use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct User { - #[serde(skip_serializing_if = "is_id_valid")] - pub id: i32, + #[serde(skip_serializing_if = "init::is_uuid_nil")] + pub id: uuid::Uuid, #[serde(skip_serializing_if = "String::is_empty")] pub username: String, #[serde(skip_serializing_if = "String::is_empty")] @@ -27,14 +29,10 @@ pub struct User { pub last_login: String, } -fn is_id_valid(num: &i32) -> bool { - *num > 0 -} - impl Default for User { fn default() -> Self { User { - id: -1, + id: uuid::Uuid::new_v4(), username: String::new(), password: String::new(), email: String::new(), -- 2.43.0 From 8fbd92620e8108574d9a7aceb2e582970d321b08 Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 4 Apr 2025 02:21:31 +0000 Subject: [PATCH 2/3] Added function to make coverart init easier (#24) Reviewed-on: https://git.kundeng.us/phoenix/icarus_models/pulls/24 Co-authored-by: phoenix Co-committed-by: phoenix --- src/access_level.rs | 4 ++-- src/coverart.rs | 26 ++++++++++++++++++++++++++ src/login_result.rs | 2 +- src/song.rs | 27 ++++++++++----------------- tests/tests.rs | 2 ++ 5 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/access_level.rs b/src/access_level.rs index a51dcef..3c828e1 100644 --- a/src/access_level.rs +++ b/src/access_level.rs @@ -12,7 +12,7 @@ pub struct AccessLevel { impl Default for AccessLevel { fn default() -> Self { AccessLevel { - id: uuid::Uuid::new_v4(), + id: uuid::Uuid::nil(), level: String::new(), song_id: uuid::Uuid::new_v4(), } @@ -21,7 +21,7 @@ impl Default for AccessLevel { pub fn default_level() -> AccessLevel { AccessLevel { - id: uuid::Uuid::new_v4(), + id: uuid::Uuid::nil(), level: String::from("Public"), song_id: uuid::Uuid::new_v4(), } diff --git a/src/coverart.rs b/src/coverart.rs index ebbf013..810d4e1 100644 --- a/src/coverart.rs +++ b/src/coverart.rs @@ -10,6 +10,19 @@ pub struct CoverArt { pub data: Vec, } +pub mod init { + use crate::coverart::CoverArt; + + pub fn init_coverart_only_path(path: String) -> CoverArt { + CoverArt { + id: uuid::Uuid::nil(), + title: String::new(), + path: path.clone(), + data: Vec::new(), + } + } +} + impl CoverArt { pub fn to_data(&self) -> Result, std::io::Error> { let path: &String = &self.path; @@ -21,3 +34,16 @@ impl CoverArt { } } } + +#[cfg(test)] +mod tests { + use crate::coverart; + + #[test] + fn test_cover_art_image() { + let path: String = String::from("somepath"); + let coverart = coverart::init::init_coverart_only_path(path.clone()); + + assert_eq!(path, coverart.path); + } +} diff --git a/src/login_result.rs b/src/login_result.rs index c4b6740..29d60d9 100644 --- a/src/login_result.rs +++ b/src/login_result.rs @@ -15,7 +15,7 @@ pub struct LoginResult { impl Default for LoginResult { fn default() -> Self { LoginResult { - id: uuid::Uuid::new_v4(), + id: uuid::Uuid::nil(), username: String::new(), token: String::new(), token_type: String::new(), diff --git a/src/song.rs b/src/song.rs index bf277ff..5ed3440 100644 --- a/src/song.rs +++ b/src/song.rs @@ -227,9 +227,9 @@ mod embedded { // The song's duration is a floating point in seconds #[derive(Clone, Debug, Deserialize, Serialize)] pub struct Song { - #[serde(skip_serializing_if = "is_embed_zero")] + #[serde(skip_serializing_if = "init::is_uuid_nil")] #[serde(alias = "id")] - pub id: i32, + pub id: uuid::Uuid, #[serde(skip_serializing_if = "String::is_empty")] pub title: String, #[serde(skip_serializing_if = "String::is_empty")] @@ -240,17 +240,17 @@ mod embedded { pub album_artist: String, #[serde(skip_serializing_if = "String::is_empty")] pub genre: String, - #[serde(skip_serializing_if = "is_embed_zero")] + #[serde(skip_serializing_if = "init::is_embed_zero")] pub year: i32, - #[serde(skip_serializing_if = "is_embed_dur_not_set")] + #[serde(skip_serializing_if = "init::is_embed_dur_not_set")] pub duration: f64, - #[serde(skip_serializing_if = "is_embed_zero")] + #[serde(skip_serializing_if = "init::is_embed_zero")] pub track: i32, - #[serde(skip_serializing_if = "is_embed_zero")] + #[serde(skip_serializing_if = "init::is_embed_zero")] pub disc: i32, - #[serde(skip_serializing_if = "is_embed_zero")] + #[serde(skip_serializing_if = "init::is_embed_zero")] pub disc_count: i32, - #[serde(skip_serializing_if = "is_embed_zero")] + #[serde(skip_serializing_if = "init::is_embed_zero")] pub track_count: i32, #[serde(skip_serializing_if = "String::is_empty")] pub audio_type: String, @@ -258,7 +258,7 @@ mod embedded { pub date_created: String, #[serde(skip_serializing_if = "String::is_empty")] pub filename: String, - #[serde(skip_serializing_if = "is_embed_zero")] + #[serde(skip_serializing_if = "init::is_embed_zero")] pub user_id: i32, #[serde(skip)] pub data: Vec, @@ -274,18 +274,11 @@ mod embedded { // pub coverart_id: i32, } - fn is_embed_zero(num: &i32) -> bool { - *num == 0 - } - - fn is_embed_dur_not_set(num: &f64) -> bool { - *num == 0.0 - } impl Default for Song { fn default() -> Self { Song { - id: 0, + id: uuid::Uuid::nil(), title: String::new(), artist: String::new(), album: String::new(), diff --git a/tests/tests.rs b/tests/tests.rs index 7df899b..f281ea7 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -28,6 +28,7 @@ mod utils { } } +#[cfg(test)] mod song_tests { use std::fs::File; use std::io::Write; @@ -151,6 +152,7 @@ mod song_tests { } } +#[cfg(test)] mod album_tests { use crate::utils; -- 2.43.0 From 6a0135c6fa95ba7aaba6736ebfac150e1c426101 Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 4 Apr 2025 02:57:00 +0000 Subject: [PATCH 3/3] Id fix (#26) Reviewed-on: https://git.kundeng.us/phoenix/icarus_models/pulls/26 Co-authored-by: phoenix Co-committed-by: phoenix --- src/song.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/song.rs b/src/song.rs index 5ed3440..16f622d 100644 --- a/src/song.rs +++ b/src/song.rs @@ -40,8 +40,8 @@ pub struct Song { pub date_created: String, #[serde(skip_serializing_if = "String::is_empty")] pub filename: String, - #[serde(skip_serializing_if = "init::is_zero")] - pub user_id: i32, + #[serde(skip_serializing_if = "init::is_uuid_nil")] + pub user_id: uuid::Uuid, #[serde(skip)] pub data: Vec, #[serde(skip)] -- 2.43.0