From 8041dc6ff544ae9c6abaa3af204f5822363cd8f1 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sun, 19 Oct 2025 00:48:49 +0000 Subject: [PATCH 1/6] tsk-72: Separating directory and filename from path in coverart (#74) This will be a breaking change Closes #72 Reviewed-on: https://git.kundeng.us/phoenix/icarus_models/pulls/74 Co-authored-by: phoenix Co-committed-by: phoenix --- .gitea/workflows/tag_release.yaml | 1 + .gitea/workflows/workflow.yaml | 1 + Cargo.lock | 2 +- Cargo.toml | 2 +- src/coverart.rs | 90 ++++++++++++++++++++++--------- 5 files changed, 69 insertions(+), 27 deletions(-) diff --git a/.gitea/workflows/tag_release.yaml b/.gitea/workflows/tag_release.yaml index dafd1bf..52ebe9c 100644 --- a/.gitea/workflows/tag_release.yaml +++ b/.gitea/workflows/tag_release.yaml @@ -4,6 +4,7 @@ on: pull_request: branches: - main + - next-v0.8 jobs: release: diff --git a/.gitea/workflows/workflow.yaml b/.gitea/workflows/workflow.yaml index 0db5383..bc38675 100644 --- a/.gitea/workflows/workflow.yaml +++ b/.gitea/workflows/workflow.yaml @@ -7,6 +7,7 @@ on: pull_request: branches: - main + - next-v0.8 jobs: check: diff --git a/Cargo.lock b/Cargo.lock index 5f275a9..9b33e3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -149,7 +149,7 @@ checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "icarus_models" -version = "0.7.0" +version = "0.7.1" dependencies = [ "josekit", "rand", diff --git a/Cargo.toml b/Cargo.toml index 5c6418d..5637ea4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus_models" -version = "0.7.0" +version = "0.7.1" edition = "2024" rust-version = "1.90" description = "models used for the icarus project" diff --git a/src/coverart.rs b/src/coverart.rs index 06ac2fc..259ed35 100644 --- a/src/coverart.rs +++ b/src/coverart.rs @@ -7,22 +7,22 @@ pub struct CoverArt { pub id: uuid::Uuid, pub title: String, #[serde(skip)] - pub path: String, + pub directory: String, + pub filename: String, #[serde(skip)] pub data: Vec, pub song_id: uuid::Uuid, } pub mod init { - use crate::coverart::CoverArt; + use super::CoverArt; - pub fn init_coverart_only_path(path: String) -> CoverArt { + /// Initializes the CoverArt with just the directory and filename + pub fn init_coverart_dir_and_filename(directory: &str, filename: &str) -> CoverArt { CoverArt { - id: uuid::Uuid::nil(), - title: String::new(), - path: path.clone(), - data: Vec::new(), - song_id: uuid::Uuid::nil(), + directory: String::from(directory), + filename: String::from(filename), + ..Default::default() } } } @@ -30,9 +30,12 @@ pub mod init { impl CoverArt { /// Saves the coverart to the filesystem pub fn save_to_filesystem(&self) -> Result<(), std::io::Error> { - match std::fs::File::create(&self.path) { - Ok(mut file) => match file.write_all(&self.data) { - Ok(_) => Ok(()), + match self.get_path() { + Ok(path) => match std::fs::File::create(&path) { + Ok(mut file) => match file.write_all(&self.data) { + Ok(_) => Ok(()), + Err(err) => Err(err), + }, Err(err) => Err(err), }, Err(err) => Err(err), @@ -41,15 +44,46 @@ impl CoverArt { /// Removes the coverart from the filesystem pub fn remove_from_filesystem(&self) -> Result<(), std::io::Error> { - let p = std::path::Path::new(&self.path); - if p.exists() { - match std::fs::remove_file(p) { - Ok(_) => Ok(()), - Err(err) => Err(err), + match self.get_path() { + Ok(path) => { + let p = std::path::Path::new(&path); + if p.exists() { + match std::fs::remove_file(p) { + Ok(_) => Ok(()), + Err(err) => Err(err), + } + } else { + Err(std::io::Error::other( + "Cannot delete file that does not exist", + )) + } } + Err(err) => Err(err), + } + } + + /// Gets the path of the CoverArt + pub fn get_path(&self) -> Result { + if self.directory.is_empty() { + return Err(std::io::Error::other("Directory has not been initialized")); + } else if self.filename.is_empty() { + return Err(std::io::Error::other("Filename has not bee initialized")); + } + + let directory = &self.directory; + let last_index = directory.len() - 1; + + if let Some(character) = directory.chars().nth(last_index) { + let buffer = if character != '/' { + directory.clone() + "/" + } else { + directory.clone() + }; + + Ok(buffer + &self.filename.clone()) } else { Err(std::io::Error::other( - "Cannot delete file that does not exist", + "Could not access last character of directory", )) } } @@ -60,11 +94,15 @@ pub mod io { /// Gets the raw data of the cover art pub fn to_data(coverart: &super::CoverArt) -> Result, std::io::Error> { - let path: &String = &coverart.path; - let mut file = std::fs::File::open(path)?; - let mut buffer = Vec::new(); - match file.read_to_end(&mut buffer) { - Ok(_) => Ok(buffer), + match coverart.get_path() { + Ok(path) => { + let mut file = std::fs::File::open(path)?; + let mut buffer = Vec::new(); + match file.read_to_end(&mut buffer) { + Ok(_) => Ok(buffer), + Err(err) => Err(err), + } + } Err(err) => Err(err), } } @@ -76,9 +114,11 @@ mod tests { #[test] fn test_cover_art_image() { - let path: String = String::from("somepath"); - let coverart = coverart::init::init_coverart_only_path(path.clone()); + let dir = String::from("./"); + let filename = String::from("CoverArt.png"); + let coverart = coverart::init::init_coverart_dir_and_filename(&dir, &filename); - assert_eq!(path, coverart.path); + assert_eq!(dir, coverart.directory); + assert_eq!(filename, coverart.filename); } } -- 2.43.0 From 51c8b5c7b3e9da1105e9f2550a02dbcb77db7b4d Mon Sep 17 00:00:00 2001 From: phoenix Date: Sun, 19 Oct 2025 01:45:35 +0000 Subject: [PATCH 2/6] tsk-73: Change data type of song from string to date (#77) Closes #73 Reviewed-on: https://git.kundeng.us/phoenix/icarus_models/pulls/77 Co-authored-by: phoenix Co-committed-by: phoenix --- .gitea/workflows/tag_release.yaml | 13 +++++++++---- Cargo.lock | 2 +- Cargo.toml | 2 +- src/song.rs | 21 +++++++++++---------- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/.gitea/workflows/tag_release.yaml b/.gitea/workflows/tag_release.yaml index 52ebe9c..717f9ac 100644 --- a/.gitea/workflows/tag_release.yaml +++ b/.gitea/workflows/tag_release.yaml @@ -1,10 +1,12 @@ name: Release Tagging on: + push: + branches: + - next-v0.8 pull_request: branches: - main - - next-v0.8 jobs: release: @@ -26,12 +28,15 @@ jobs: run: | VERSION=$(grep '^version = "' Cargo.toml | sed -E 's/version = "([^"]+)"/\1/') PROJECT_COMMIT_HASH=$(git rev-parse HEAD | cut -c 1-10) - BRANCH_REF="${GITHUB_REF}" + BRANCH_REF="${{ gitea.ref }}" BRANCH_NAME=$(echo "$BRANCH_REF" | cut -d '/' -f 3) - PROJECT_TAG_RELEASE="v$VERSION-$BRANCH_NAME-$PROJECT_COMMIT_HASH" - echo "::set-output name=project_tag_release::$PROJECT_TAG_RELEASE-111" + PROJECT_TAG_RELEASE="v$VERSION-$BRANCH_NAME-$PROJECT_COMMIT_HASH-111" + + echo "::set-output name=project_tag_release::$PROJECT_TAG_RELEASE" + echo "Version: $VERSION" echo "Hash: $PROJECT_COMMIT_HASH" + echo "Branh ref: $BRANCH_REF" echo "Branch: $BRANCH_NAME" echo "Tag Release: $PROJECT_TAG_RELEASE" diff --git a/Cargo.lock b/Cargo.lock index 9b33e3e..8cf848a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -149,7 +149,7 @@ checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "icarus_models" -version = "0.7.1" +version = "0.7.2" dependencies = [ "josekit", "rand", diff --git a/Cargo.toml b/Cargo.toml index 5637ea4..54a405f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus_models" -version = "0.7.1" +version = "0.7.2" edition = "2024" rust-version = "1.90" description = "models used for the icarus project" diff --git a/src/song.rs b/src/song.rs index 230b516..af0f209 100644 --- a/src/song.rs +++ b/src/song.rs @@ -39,8 +39,8 @@ pub struct Song { pub track_count: i32, #[serde(skip_serializing_if = "String::is_empty")] pub audio_type: String, - #[serde(skip_serializing_if = "String::is_empty")] - pub date_created: String, + #[serde(with = "time::serde::rfc3339::option")] + pub date_created: Option, #[serde(skip_serializing_if = "String::is_empty")] pub filename: String, #[serde(skip_serializing_if = "init::is_uuid_nil")] @@ -71,21 +71,22 @@ impl Song { pub fn song_path(&self) -> Result { if self.directory.is_empty() { - return Err(std::io::Error::other("Directory does not exist")); + return Err(std::io::Error::other("Directory has not been initialized")); + } else if self.filename.is_empty() { + return Err(std::io::Error::other("Filename has not bee initialized")); } let directory = &self.directory; - let mut buffer: String = directory.clone(); let last_index = directory.len() - 1; if let Some(character) = directory.chars().nth(last_index) { - if character != '/' { - buffer += "/"; - } + let buffer: String = if character != '/' { + directory.clone() + "/" + } else { + directory.clone() + }; - buffer += &self.filename.clone(); - - Ok(buffer) + Ok(buffer + &self.filename.clone()) } else { Err(std::io::Error::other( "Could not access last character of directory", -- 2.43.0 From 44d08cdb1f41c0de292b820f859b25cb08a7c0a3 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sun, 19 Oct 2025 02:18:29 +0000 Subject: [PATCH 3/6] tsk-71: Add token expiration checks (#78) Closes #71 Reviewed-on: https://git.kundeng.us/phoenix/icarus_models/pulls/78 Co-authored-by: phoenix Co-committed-by: phoenix --- .gitea/workflows/tag_release.yaml | 4 +--- Cargo.lock | 2 +- Cargo.toml | 2 +- src/login_result.rs | 22 ++++++++-------------- src/token.rs | 30 ++++++++++++------------------ 5 files changed, 23 insertions(+), 37 deletions(-) diff --git a/.gitea/workflows/tag_release.yaml b/.gitea/workflows/tag_release.yaml index 717f9ac..d424e07 100644 --- a/.gitea/workflows/tag_release.yaml +++ b/.gitea/workflows/tag_release.yaml @@ -2,11 +2,9 @@ name: Release Tagging on: push: - branches: - - next-v0.8 - pull_request: branches: - main + - next-v0.8 jobs: release: diff --git a/Cargo.lock b/Cargo.lock index 8cf848a..9a6f1c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -149,7 +149,7 @@ checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "icarus_models" -version = "0.7.2" +version = "0.7.3" dependencies = [ "josekit", "rand", diff --git a/Cargo.toml b/Cargo.toml index 54a405f..9a7974c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus_models" -version = "0.7.2" +version = "0.7.3" edition = "2024" rust-version = "1.90" description = "models used for the icarus project" diff --git a/src/login_result.rs b/src/login_result.rs index 670be51..ff03083 100644 --- a/src/login_result.rs +++ b/src/login_result.rs @@ -2,7 +2,7 @@ use std::default::Default; use serde::{Deserialize, Serialize}; -#[derive(Clone, Debug, Deserialize, Serialize, utoipa::ToSchema)] +#[derive(Clone, Debug, Default, Deserialize, Serialize, utoipa::ToSchema)] pub struct LoginResult { pub id: uuid::Uuid, pub username: String, @@ -12,20 +12,14 @@ pub struct LoginResult { pub expiration: i64, } -impl Default for LoginResult { - fn default() -> Self { - LoginResult { - id: uuid::Uuid::nil(), - username: String::new(), - token: String::new(), - token_type: String::new(), - expiration: -1, - } - } -} - impl LoginResult { - pub fn _to_json(&self) -> Result { + pub fn to_json(&self) -> Result { serde_json::to_string_pretty(&self) } + + pub fn token_expired(&self) -> bool { + let current_time = time::OffsetDateTime::now_utc(); + let expired = time::OffsetDateTime::from_unix_timestamp(self.expiration).unwrap(); + current_time > expired + } } diff --git a/src/token.rs b/src/token.rs index 5ade1d0..5831a75 100644 --- a/src/token.rs +++ b/src/token.rs @@ -2,7 +2,7 @@ use std::default::Default; use serde::{Deserialize, Serialize}; -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct Token { pub scope: String, pub expiration: i64, @@ -27,23 +27,16 @@ pub struct AccessToken { pub message: String, } -impl Default for Token { - fn default() -> Self { - Token { - scope: String::new(), - expiration: -1, - audience: String::new(), - issuer: String::new(), - issued: -1, - } - } -} - impl AccessToken { + /// Get the token fit for Bearer authentication pub fn bearer_token(&self) -> String { - let mut token: String = String::from("Bearer "); - token += &self.token.clone(); - token + format!("Bearer {}", self.token) + } + + pub fn token_expired(&self) -> bool { + let current_time = time::OffsetDateTime::now_utc(); + let expired = time::OffsetDateTime::from_unix_timestamp(self.expiration).unwrap(); + current_time > expired } } @@ -52,9 +45,10 @@ impl Token { serde_json::to_string_pretty(&self) } - // TODO: Implement pub fn token_expired(&self) -> bool { - false + let current_time = time::OffsetDateTime::now_utc(); + let expired = time::OffsetDateTime::from_unix_timestamp(self.expiration).unwrap(); + current_time > expired } pub fn contains_scope(&self, des_scope: &String) -> bool { -- 2.43.0 From 9dcf46ec0a6de9b87068f32d6b8a79f14d033616 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sun, 19 Oct 2025 21:08:08 -0400 Subject: [PATCH 4/6] Updated workflows --- .gitea/workflows/tag_release.yaml | 1 - .gitea/workflows/workflow.yaml | 3 --- 2 files changed, 4 deletions(-) diff --git a/.gitea/workflows/tag_release.yaml b/.gitea/workflows/tag_release.yaml index d424e07..0a829b4 100644 --- a/.gitea/workflows/tag_release.yaml +++ b/.gitea/workflows/tag_release.yaml @@ -4,7 +4,6 @@ on: push: branches: - main - - next-v0.8 jobs: release: diff --git a/.gitea/workflows/workflow.yaml b/.gitea/workflows/workflow.yaml index bc38675..68527ae 100644 --- a/.gitea/workflows/workflow.yaml +++ b/.gitea/workflows/workflow.yaml @@ -7,7 +7,6 @@ on: pull_request: branches: - main - - next-v0.8 jobs: check: @@ -61,5 +60,3 @@ jobs: with: toolchain: 1.90.0 - run: cargo build - - -- 2.43.0 From 5a8118726b8726c8405161478aaa25c221c314f7 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sun, 19 Oct 2025 21:23:32 -0400 Subject: [PATCH 5/6] Version bump --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a6f1c4..ee0a815 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -149,7 +149,7 @@ checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "icarus_models" -version = "0.7.3" +version = "0.8.0" dependencies = [ "josekit", "rand", diff --git a/Cargo.toml b/Cargo.toml index 9a7974c..615ee65 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus_models" -version = "0.7.3" +version = "0.8.0" edition = "2024" rust-version = "1.90" description = "models used for the icarus project" -- 2.43.0 From 97783568e9bdc23fa0109c1c6a5ad9fed93fe022 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sun, 19 Oct 2025 21:25:30 -0400 Subject: [PATCH 6/6] cargo update --- Cargo.lock | 51 +++++++++++++++++++++------------------------------ 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ee0a815..ad462e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,9 +31,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "bumpalo" @@ -53,9 +53,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "crc32fast" @@ -131,14 +131,14 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", "r-efi", - "wasi", + "wasip2", ] [[package]] @@ -163,9 +163,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", "hashbrown", @@ -254,9 +254,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" dependencies = [ "bitflags", "cfg-if", @@ -280,9 +280,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" dependencies = [ "cc", "libc", @@ -366,9 +366,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a52d8d02cacdb176ef4678de6c052efb4b3da14b78e4db683a4252762be5433" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -378,9 +378,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722166aa0d7438abbaa4d5cc2c649dac844e8c56d82fb3d33e9c34b5cd268fc6" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -389,9 +389,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3160422bbd54dd5ecfdca71e5fd59b7b8fe2b1697ab2baf64f6d05dcc66d298" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rustix" @@ -476,9 +476,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "syn" -version = "2.0.106" +version = "2.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" dependencies = [ "proc-macro2", "quote", @@ -597,15 +597,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" -- 2.43.0