Compare commits

..

3 Commits

Author SHA1 Message Date
bd26afdddf Version bump
All checks were successful
Release Tagging / release (pull_request) Successful in 46s
Rust Build / Test Suite (pull_request) Successful in 41s
Rust Build / Rustfmt (pull_request) Successful in 59s
Rust Build / Clippy (pull_request) Successful in 42s
Rust Build / Check (pull_request) Successful in 40s
Rust Build / build (pull_request) Successful in 48s
2025-10-18 21:02:13 -04:00
580f5e9be7 tsk-73: Code cleanup:
:
2025-10-18 21:00:38 -04:00
3ee3ac737b tsk-73: Change type of date_created to an option of time::OffsetDateTime 2025-10-18 20:57:21 -04:00
13 changed files with 108 additions and 148 deletions

View File

@@ -1,9 +1,10 @@
name: Release Tagging name: Release Tagging
on: on:
push: pull_request:
branches: branches:
- main - main
- next-v0.8
jobs: jobs:
release: release:
@@ -25,15 +26,12 @@ jobs:
run: | run: |
VERSION=$(grep '^version = "' Cargo.toml | sed -E 's/version = "([^"]+)"/\1/') VERSION=$(grep '^version = "' Cargo.toml | sed -E 's/version = "([^"]+)"/\1/')
PROJECT_COMMIT_HASH=$(git rev-parse HEAD | cut -c 1-10) PROJECT_COMMIT_HASH=$(git rev-parse HEAD | cut -c 1-10)
BRANCH_REF="${{ gitea.ref }}" BRANCH_REF="${GITHUB_REF}"
BRANCH_NAME=$(echo "$BRANCH_REF" | cut -d '/' -f 3) BRANCH_NAME=$(echo "$BRANCH_REF" | cut -d '/' -f 3)
PROJECT_TAG_RELEASE="v$VERSION-$BRANCH_NAME-$PROJECT_COMMIT_HASH-111" PROJECT_TAG_RELEASE="v$VERSION-$BRANCH_NAME-$PROJECT_COMMIT_HASH"
echo "::set-output name=project_tag_release::$PROJECT_TAG_RELEASE-111"
echo "::set-output name=project_tag_release::$PROJECT_TAG_RELEASE"
echo "Version: $VERSION" echo "Version: $VERSION"
echo "Hash: $PROJECT_COMMIT_HASH" echo "Hash: $PROJECT_COMMIT_HASH"
echo "Branh ref: $BRANCH_REF"
echo "Branch: $BRANCH_NAME" echo "Branch: $BRANCH_NAME"
echo "Tag Release: $PROJECT_TAG_RELEASE" echo "Tag Release: $PROJECT_TAG_RELEASE"

View File

@@ -7,6 +7,7 @@ on:
pull_request: pull_request:
branches: branches:
- main - main
- next-v0.8
jobs: jobs:
check: check:
@@ -60,3 +61,5 @@ jobs:
with: with:
toolchain: 1.90.0 toolchain: 1.90.0
- run: cargo build - run: cargo build

53
Cargo.lock generated
View File

@@ -31,9 +31,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.10.0" version = "2.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394"
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
@@ -53,9 +53,9 @@ dependencies = [
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.4" version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
[[package]] [[package]]
name = "crc32fast" name = "crc32fast"
@@ -131,14 +131,14 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.3.4" version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
"r-efi", "r-efi",
"wasip2", "wasi",
] ]
[[package]] [[package]]
@@ -149,7 +149,7 @@ checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
[[package]] [[package]]
name = "icarus_models" name = "icarus_models"
version = "0.8.3" version = "0.7.2"
dependencies = [ dependencies = [
"josekit", "josekit",
"rand", "rand",
@@ -163,9 +163,9 @@ dependencies = [
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.12.0" version = "2.11.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown", "hashbrown",
@@ -254,9 +254,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]] [[package]]
name = "openssl" name = "openssl"
version = "0.10.74" version = "0.10.73"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"cfg-if", "cfg-if",
@@ -280,9 +280,9 @@ dependencies = [
[[package]] [[package]]
name = "openssl-sys" name = "openssl-sys"
version = "0.9.110" version = "0.9.109"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
dependencies = [ dependencies = [
"cc", "cc",
"libc", "libc",
@@ -366,9 +366,9 @@ dependencies = [
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.12.2" version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" checksum = "4a52d8d02cacdb176ef4678de6c052efb4b3da14b78e4db683a4252762be5433"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@@ -378,9 +378,9 @@ dependencies = [
[[package]] [[package]]
name = "regex-automata" name = "regex-automata"
version = "0.4.13" version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" checksum = "722166aa0d7438abbaa4d5cc2c649dac844e8c56d82fb3d33e9c34b5cd268fc6"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@@ -389,9 +389,9 @@ dependencies = [
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.8.8" version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" checksum = "c3160422bbd54dd5ecfdca71e5fd59b7b8fe2b1697ab2baf64f6d05dcc66d298"
[[package]] [[package]]
name = "rustix" name = "rustix"
@@ -476,9 +476,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.107" version = "2.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -597,6 +597,15 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 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]] [[package]]
name = "wasip2" name = "wasip2"
version = "1.0.1+wasi-0.2.4" version = "1.0.1+wasi-0.2.4"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "icarus_models" name = "icarus_models"
version = "0.8.3" version = "0.7.2"
edition = "2024" edition = "2024"
rust-version = "1.90" rust-version = "1.90"
description = "models used for the icarus project" description = "models used for the icarus project"

View File

@@ -1,3 +1,2 @@
A library containing commonly used structs, functions, enums, constants and other code A library containing commonly used models and functions that is used throughout
that is used throughout the icarus projects. Code from this library serves as the model icarus projects. This reduces the amount of duplicated code without a benefit.
for other projects in the icarus project.

View File

@@ -12,9 +12,3 @@ pub mod file_extensions {
pub const PNGEXTENSION: &str = ".png"; pub const PNGEXTENSION: &str = ".png";
} }
} }
pub mod error {
pub const DIRECTORY_NOT_INITIALIZED: &str = "Directory has not been initialized";
pub const FILENAME_NOT_INITIALIZED: &str = "Filename has not bee initialized";
pub const LAST_CHARACTER_IN_DIRECTORY: &str = "Could not access last character of directory";
}

View File

@@ -1,10 +1,7 @@
use std::io::Write; use std::io::Write;
use rand::Rng;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
const FILENAME_LENGTH: i32 = 16;
#[derive(Clone, Debug, Default, Deserialize, Serialize, utoipa::ToSchema)] #[derive(Clone, Debug, Default, Deserialize, Serialize, utoipa::ToSchema)]
pub struct CoverArt { pub struct CoverArt {
pub id: uuid::Uuid, pub id: uuid::Uuid,
@@ -68,56 +65,27 @@ impl CoverArt {
/// Gets the path of the CoverArt /// Gets the path of the CoverArt
pub fn get_path(&self) -> Result<String, std::io::Error> { pub fn get_path(&self) -> Result<String, std::io::Error> {
if self.directory.is_empty() { if self.directory.is_empty() {
return Err(std::io::Error::other( return Err(std::io::Error::other("Directory has not been initialized"));
crate::constants::error::DIRECTORY_NOT_INITIALIZED,
));
} else if self.filename.is_empty() { } else if self.filename.is_empty() {
return Err(std::io::Error::other( return Err(std::io::Error::other("Filename has not bee initialized"));
crate::constants::error::FILENAME_NOT_INITIALIZED,
));
} }
let directory = &self.directory; let directory = &self.directory;
let last_index = directory.len() - 1; let last_index = directory.len() - 1;
match crate::util::concatenate_path(directory, &self.filename, last_index) { if let Some(character) = directory.chars().nth(last_index) {
Ok(path) => Ok(path), let buffer = if character != '/' {
Err(err) => Err(err), directory.clone() + "/"
} } else {
} directory.clone()
} };
/// Generates filename for a CoverArt Ok(buffer + &self.filename.clone())
pub fn generate_filename(typ: crate::types::CoverArtTypes, randomize: bool) -> String { } else {
let file_extension = match typ { Err(std::io::Error::other(
crate::types::CoverArtTypes::PngExtension => { "Could not access last character of directory",
String::from(crate::constants::file_extensions::image::PNGEXTENSION) ))
} }
crate::types::CoverArtTypes::JpegExtension => {
String::from(crate::constants::file_extensions::image::JPEGEXTENSION)
}
crate::types::CoverArtTypes::JpgExtension => {
String::from(crate::constants::file_extensions::image::JPGEXTENSION)
}
};
if randomize {
let mut filename: String = String::from("coverart-");
let some_chars: String = String::from("abcdefghij0123456789");
let some_chars_length = some_chars.len();
let mut rng = rand::rng();
for _ in 0..FILENAME_LENGTH {
let index = rng.random_range(0..=some_chars_length);
let rando_char = some_chars.chars().nth(index);
if let Some(c) = rando_char {
filename.push(c);
}
}
filename + &file_extension
} else {
"coverart-output".to_string() + &file_extension
} }
} }

View File

@@ -7,7 +7,6 @@ pub mod song;
pub mod token; pub mod token;
pub mod types; pub mod types;
pub mod user; pub mod user;
pub mod util;
pub mod init { pub mod init {
pub fn is_id_valid(num: &i32) -> bool { pub fn is_id_valid(num: &i32) -> bool {

View File

@@ -2,7 +2,7 @@ use std::default::Default;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize, utoipa::ToSchema)] #[derive(Clone, Debug, Deserialize, Serialize, utoipa::ToSchema)]
pub struct LoginResult { pub struct LoginResult {
pub id: uuid::Uuid, pub id: uuid::Uuid,
pub username: String, pub username: String,
@@ -12,14 +12,20 @@ pub struct LoginResult {
pub expiration: i64, pub expiration: i64,
} }
impl LoginResult { impl Default for LoginResult {
pub fn to_json(&self) -> Result<String, serde_json::Error> { fn default() -> Self {
serde_json::to_string_pretty(&self) LoginResult {
} id: uuid::Uuid::nil(),
username: String::new(),
pub fn token_expired(&self) -> bool { token: String::new(),
let current_time = time::OffsetDateTime::now_utc(); token_type: String::new(),
let expired = time::OffsetDateTime::from_unix_timestamp(self.expiration).unwrap(); expiration: -1,
current_time > expired }
}
}
impl LoginResult {
pub fn _to_json(&self) -> Result<String, serde_json::Error> {
serde_json::to_string_pretty(&self)
} }
} }

View File

@@ -69,24 +69,28 @@ impl Song {
} }
} }
/// Gets the path of a Song
pub fn song_path(&self) -> Result<String, std::io::Error> { pub fn song_path(&self) -> Result<String, std::io::Error> {
if self.directory.is_empty() { if self.directory.is_empty() {
return Err(std::io::Error::other( return Err(std::io::Error::other("Directory has not been initialized"));
crate::constants::error::DIRECTORY_NOT_INITIALIZED,
));
} else if self.filename.is_empty() { } else if self.filename.is_empty() {
return Err(std::io::Error::other( return Err(std::io::Error::other("Filename has not bee initialized"));
crate::constants::error::FILENAME_NOT_INITIALIZED,
));
} }
let directory = &self.directory; let directory = &self.directory;
let last_index = directory.len() - 1; let last_index = directory.len() - 1;
match crate::util::concatenate_path(directory, &self.filename, last_index) { if let Some(character) = directory.chars().nth(last_index) {
Ok(path) => Ok(path), let buffer: String = if character != '/' {
Err(err) => Err(err), directory.clone() + "/"
} else {
directory.clone()
};
Ok(buffer + &self.filename.clone())
} else {
Err(std::io::Error::other(
"Could not access last character of directory",
))
} }
} }
@@ -125,12 +129,14 @@ impl Song {
} }
} }
/// Generates a filename. In order to save a song to the filesystem /// Generates a filename. In order to save a song to the filesystem, the song must have
/// a directory and filename
pub fn generate_filename(typ: types::MusicTypes, randomize: bool) -> String { pub fn generate_filename(typ: types::MusicTypes, randomize: bool) -> String {
let file_extension = match typ { let file_extension = match typ {
types::MusicTypes::DefaultMusicExtension => { types::MusicTypes::DefaultMusicExtension => {
String::from(constants::file_extensions::audio::DEFAULTMUSICEXTENSION) String::from(constants::file_extensions::audio::DEFAULTMUSICEXTENSION)
} }
types::MusicTypes::WavExtension => { types::MusicTypes::WavExtension => {
String::from(constants::file_extensions::audio::WAVEXTENSION) String::from(constants::file_extensions::audio::WAVEXTENSION)
} }
@@ -143,13 +149,12 @@ pub fn generate_filename(typ: types::MusicTypes, randomize: bool) -> String {
}; };
if randomize { if randomize {
let mut filename: String = String::from("track-"); let mut filename: String = String::new();
let some_chars: String = String::from("abcdefghij0123456789"); let some_chars: String = String::from("abcdefghij0123456789");
let some_chars_length = some_chars.len();
let mut rng = rand::rng(); let mut rng = rand::rng();
for _ in 0..FILENAME_LENGTH { for _ in 0..FILENAME_LENGTH {
let index = rng.random_range(0..=some_chars_length); let index = rng.random_range(0..=19);
let rando_char = some_chars.chars().nth(index); let rando_char = some_chars.chars().nth(index);
if let Some(c) = rando_char { if let Some(c) = rando_char {

View File

@@ -2,7 +2,7 @@ use std::default::Default;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize)] #[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Token { pub struct Token {
pub scope: String, pub scope: String,
pub expiration: i64, pub expiration: i64,
@@ -27,16 +27,23 @@ pub struct AccessToken {
pub message: String, pub message: String,
} }
impl AccessToken { impl Default for Token {
/// Get the token fit for Bearer authentication fn default() -> Self {
pub fn bearer_token(&self) -> String { Token {
format!("Bearer {}", self.token) scope: String::new(),
expiration: -1,
audience: String::new(),
issuer: String::new(),
issued: -1,
}
} }
}
pub fn token_expired(&self) -> bool { impl AccessToken {
let current_time = time::OffsetDateTime::now_utc(); pub fn bearer_token(&self) -> String {
let expired = time::OffsetDateTime::from_unix_timestamp(self.expiration).unwrap(); let mut token: String = String::from("Bearer ");
current_time > expired token += &self.token.clone();
token
} }
} }
@@ -45,10 +52,9 @@ impl Token {
serde_json::to_string_pretty(&self) serde_json::to_string_pretty(&self)
} }
// TODO: Implement
pub fn token_expired(&self) -> bool { pub fn token_expired(&self) -> bool {
let current_time = time::OffsetDateTime::now_utc(); false
let expired = time::OffsetDateTime::from_unix_timestamp(self.expiration).unwrap();
current_time > expired
} }
pub fn contains_scope(&self, des_scope: &String) -> bool { pub fn contains_scope(&self, des_scope: &String) -> bool {

View File

@@ -1,14 +1,6 @@
#[derive(Debug)]
pub enum MusicTypes { pub enum MusicTypes {
DefaultMusicExtension, DefaultMusicExtension,
WavExtension, WavExtension,
FlacExtension, FlacExtension,
MPThreeExtension, MPThreeExtension,
} }
#[derive(Debug)]
pub enum CoverArtTypes {
PngExtension,
JpegExtension,
JpgExtension,
}

View File

@@ -1,19 +0,0 @@
pub fn concatenate_path(
directory: &str,
filename: &str,
last_index: usize,
) -> Result<String, std::io::Error> {
if let Some(character) = directory.chars().nth(last_index) {
let buffer: String = if character != '/' {
format!("{directory}/")
} else {
String::from(directory)
};
Ok(format!("{buffer}{filename}"))
} else {
Err(std::io::Error::other(
crate::constants::error::LAST_CHARACTER_IN_DIRECTORY,
))
}
}