From 4982e6e3aabb8a4d537f490441ff7f05fdbc63fc Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Tue, 10 Nov 2026 23:37:49 +0000 Subject: [PATCH] Sonar: shell, workflow, Rust, HTML and analysis-scope findings See the pull request for each change. --- .github/workflows/artcraft-macos-publish.yml | 11 +++++------ .github/workflows/artcraft-windows-publish.yml | 6 +++--- Cargo.lock | 1 + .../src/requests/common/task_id.rs | 4 ---- .../google_refresh_token/google_refresh_token.rs | 4 ++-- .../handlers/fal/handle_fal_complete.rs | 5 +---- .../artcraft/src/core/utils/auto_download.rs | 2 +- .../src/core/utils/simple_http_download.rs | 10 +--------- .../helpers/handle_successful_generations.rs | 5 +---- .../threads/worldlabs_marble_task_polling.rs | 5 +---- crates/schema/database/sqlite_tasks/Cargo.toml | 1 + .../database/sqlite_tasks/src/connection.rs | 2 +- frontend/api_docs.html | 6 +++--- frontend/build_modules.sh | 2 +- packaging/linux/package-test.sh | 6 +++--- packaging/linux/package.sh | 2 +- script/artcraft/unix_build.sh | 2 +- script/artcraft/unix_dev.sh | 2 +- .../artcraft/unix_frontend_production_build.sh | 2 +- .../artcraft/unix_frontend_production_preview.sh | 2 +- script/common/frontend_preflight.sh | 16 ++++++++-------- sonar-project.properties | 15 +++++++++++++++ 22 files changed, 53 insertions(+), 58 deletions(-) diff --git a/.github/workflows/artcraft-macos-publish.yml b/.github/workflows/artcraft-macos-publish.yml index 59ca9a9532..4c9fbfb875 100644 --- a/.github/workflows/artcraft-macos-publish.yml +++ b/.github/workflows/artcraft-macos-publish.yml @@ -46,7 +46,7 @@ jobs: node-version: lts/* - name: install Rust stable - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable with: targets: ${{ matrix.platform == 'macos-latest-xlarge' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }} @@ -72,7 +72,7 @@ jobs: npm cache clean --force echo "Installing all workspace dependencies..." - npm ci + npm ci --ignore-scripts echo "=== Version Information ===" echo "Node version:" @@ -205,9 +205,8 @@ jobs: # Increase Node.js memory limit for the build export NODE_OPTIONS="--max-old-space-size=8192" - # Use npx to ensure we use the local nx version - echo "Building with npx nx..." - npx nx run artcraft:build + echo "Building with nx..." + ./node_modules/.bin/nx run artcraft:build echo "Checking build output..." # shellcheck disable=SC2012 @@ -226,7 +225,7 @@ jobs: - name: build and publish - uses: tauri-apps/tauri-action@v0 + uses: tauri-apps/tauri-action@fce9c6108b31ea247710505d3aaaa893ee6768d4 # v0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} APPLE_ID: ${{ secrets.APPLE_ID }} diff --git a/.github/workflows/artcraft-windows-publish.yml b/.github/workflows/artcraft-windows-publish.yml index cb07d151a7..9f5f366ac1 100644 --- a/.github/workflows/artcraft-windows-publish.yml +++ b/.github/workflows/artcraft-windows-publish.yml @@ -36,7 +36,7 @@ jobs: - uses: actions/checkout@v7 - name: install Rust stable - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable - name: install wreq dependencies run: | @@ -61,7 +61,7 @@ jobs: npm cache clean --force echo "Installing all workspace dependencies..." - npm ci + npm ci --ignore-scripts echo "=== Version Information ===" echo "Node version:" @@ -101,7 +101,7 @@ jobs: $config | ConvertTo-Json -Depth 10 | Set-Content tauri.conf.json - name: build and publish - uses: tauri-apps/tauri-action@v0 + uses: tauri-apps/tauri-action@fce9c6108b31ea247710505d3aaaa893ee6768d4 # v0 env: # NB(bt): This is needed by wreq. Hopefully it doesn't kill Tauri RUSTFLAGS: "-C target-feature=+crt-static" diff --git a/Cargo.lock b/Cargo.lock index 14cb4ad903..9b9ae95855 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8075,6 +8075,7 @@ dependencies = [ "sqlx", "tempfile", "tokens", + "tokio", ] [[package]] diff --git a/crates/api_clients/openai_sora_client/src/requests/common/task_id.rs b/crates/api_clients/openai_sora_client/src/requests/common/task_id.rs index 131d933fe9..b1894ef8b2 100644 --- a/crates/api_clients/openai_sora_client/src/requests/common/task_id.rs +++ b/crates/api_clients/openai_sora_client/src/requests/common/task_id.rs @@ -21,10 +21,6 @@ impl TaskId { pub fn as_str(&self) -> &str { &self.0 } - - pub fn to_string(&self) -> String { - self.0.to_string() - } } impl Display for TaskId { diff --git a/crates/api_clients/worldlabs_consumer_client/src/api/requests/google_refresh_token/google_refresh_token.rs b/crates/api_clients/worldlabs_consumer_client/src/api/requests/google_refresh_token/google_refresh_token.rs index 7db5e6b9b1..259a45d38c 100644 --- a/crates/api_clients/worldlabs_consumer_client/src/api/requests/google_refresh_token/google_refresh_token.rs +++ b/crates/api_clients/worldlabs_consumer_client/src/api/requests/google_refresh_token/google_refresh_token.rs @@ -141,8 +141,8 @@ mod tests { async fn test_requests() -> AnyhowResult<()> { setup_test_logging(LevelFilter::Debug); - let refresh_token = "AMf-vByUgA0J9S93vULECe-sD50cbR85AFVYF60gKAmLFF1MBYwXlKRJCsv7z3oSpLtP0ApyOU5fAl52qHWM2U0yKgEu5gQ5UCUDt5SEG4UBRHWvHEmLLcu-Zl04Fq4ljocSEO3qJzuX1wyshmptZxlDPRkjdLYgyn-Kp03woI2yRPKLuQF5hQtABHabsNUh9Zhs129sgxuUlOuw4zsFI4L8UdE3bEuF3k6Mic7KlE3440YwyQ8Qtmk9zHtXIx2ob56N-1WTGSqwMUuQ1mX4OOvLve9bw2zDW3UzchomTWkh732886RPrP-DNRkPbO3FejUEMxuYQFWYX3EEeIEdfNGXFNGPL1dNniSXlSaKadpX699Ishjviv-x9o-pPQa3zoAj3NzWLyd8mn5rDBh9qAO_iDETaeo01Sjhb4mGYfAWZ-g4S6nW778"; - let refresh_token = WorldLabsRefreshToken::new(refresh_token.to_string()); + let refresh_token = std::env::var("WORLDLABS_REFRESH_TOKEN")?; + let refresh_token = WorldLabsRefreshToken::new(refresh_token); let result = google_refresh_token(GoogleRefreshTokenArgs { refresh_token: &refresh_token, diff --git a/crates/desktop/artcraft/src/core/threads/third_party_task_polling_thread/handlers/fal/handle_fal_complete.rs b/crates/desktop/artcraft/src/core/threads/third_party_task_polling_thread/handlers/fal/handle_fal_complete.rs index 620d19aec0..ba7b100e23 100644 --- a/crates/desktop/artcraft/src/core/threads/third_party_task_polling_thread/handlers/fal/handle_fal_complete.rs +++ b/crates/desktop/artcraft/src/core/threads/third_party_task_polling_thread/handlers/fal/handle_fal_complete.rs @@ -31,8 +31,6 @@ use sqlite_tasks::queries::task::Task; use sqlite_tasks::queries::update_successful_task_status_with_metadata::{ update_successful_task_status_with_metadata, UpdateSuccessfulTaskArgs, }; -use std::fs::File; -use std::io::Write; use std::path::PathBuf; use std::time::Duration; use tauri::AppHandle; @@ -255,8 +253,7 @@ async fn download_file( let filename = format!("fal_{}_{}.{}", generate_random_uuid(), index, extension); let download_path = tempdir.join(filename); - let mut file = File::create(&download_path)?; - file.write_all(&bytes)?; + tokio::fs::write(&download_path, &bytes).await?; Ok(download_path) } diff --git a/crates/desktop/artcraft/src/core/utils/auto_download.rs b/crates/desktop/artcraft/src/core/utils/auto_download.rs index 3b4e2f3e31..a2e52d525a 100644 --- a/crates/desktop/artcraft/src/core/utils/auto_download.rs +++ b/crates/desktop/artcraft/src/core/utils/auto_download.rs @@ -94,7 +94,7 @@ async fn download_generated_results( } ensure!(!urls.is_empty(), "Completed task has no downloadable results"); let path = checkpoint_path(root, task); - let mut checkpoint: AutoDownloadCheckpoint = match std::fs::read(&path) { + let mut checkpoint: AutoDownloadCheckpoint = match tokio::fs::read(&path).await { Ok(bytes) => serde_json::from_slice(&bytes)?, Err(err) if err.kind() == std::io::ErrorKind::NotFound => { AutoDownloadCheckpoint { download_time: Local::now(), saved: BTreeMap::new() } diff --git a/crates/desktop/artcraft/src/core/utils/simple_http_download.rs b/crates/desktop/artcraft/src/core/utils/simple_http_download.rs index 966b71950c..c75265a1f2 100644 --- a/crates/desktop/artcraft/src/core/utils/simple_http_download.rs +++ b/crates/desktop/artcraft/src/core/utils/simple_http_download.rs @@ -1,8 +1,6 @@ use errors::AnyhowResult; use reqwest::Client; use reqwest::Url; -use std::fs::OpenOptions; -use std::io::Write; use std::path::Path; const USER_AGENT: &str = "storyteller-client/1.0"; @@ -22,13 +20,7 @@ pub async fn simple_http_download>(url: &Url, download_path: P) - //let response : Response = reqwest::get(url).await?; let bytes = response.bytes().await?; - let mut file = OpenOptions::new() - .create(true) // To create a new file - .write(true) - .truncate(true) - .open(download_path)?; - - file.write_all(&bytes)?; + tokio::fs::write(download_path, &bytes).await?; Ok(()) } diff --git a/crates/desktop/artcraft/src/services/sora/threads/sora_task_polling/helpers/handle_successful_generations.rs b/crates/desktop/artcraft/src/services/sora/threads/sora_task_polling/helpers/handle_successful_generations.rs index b3bf451457..6fd5902102 100644 --- a/crates/desktop/artcraft/src/services/sora/threads/sora_task_polling/helpers/handle_successful_generations.rs +++ b/crates/desktop/artcraft/src/services/sora/threads/sora_task_polling/helpers/handle_successful_generations.rs @@ -33,8 +33,6 @@ use sqlite_tasks::queries::task::Task; use sqlite_tasks::queries::update_successful_task_status_with_metadata::{update_successful_task_status_with_metadata, UpdateSuccessfulTaskArgs}; use sqlite_tasks::queries::update_task_status::{update_task_status, UpdateTaskArgs}; use std::collections::{HashMap, HashSet}; -use std::fs::File; -use std::io::Write; use std::path::PathBuf; use artcraft_client::credentials::storyteller_credential_set::StorytellerCredentialSet; use artcraft_client::endpoints::media_files::get_media_file::get_media_file; @@ -213,8 +211,7 @@ async fn download_generation_item( info!("Writing to path: {:?}", download_path); - let mut file = File::create(&download_path)?; - file.write_all(&image_bytes)?; + tokio::fs::write(&download_path, &image_bytes).await?; Ok(download_path) } diff --git a/crates/desktop/artcraft/src/services/worldlabs/threads/worldlabs_marble_task_polling.rs b/crates/desktop/artcraft/src/services/worldlabs/threads/worldlabs_marble_task_polling.rs index 1b52c9f615..271a3a4608 100644 --- a/crates/desktop/artcraft/src/services/worldlabs/threads/worldlabs_marble_task_polling.rs +++ b/crates/desktop/artcraft/src/services/worldlabs/threads/worldlabs_marble_task_polling.rs @@ -39,8 +39,6 @@ use sqlite_tasks::queries::task::Task; use sqlite_tasks::queries::update_successful_task_status_with_metadata::{update_successful_task_status_with_metadata, UpdateSuccessfulTaskArgs}; use sqlite_tasks::queries::update_task_status::{update_task_status, UpdateTaskArgs}; use std::collections::{HashMap, HashSet}; -use std::fs::File; -use std::io::Write; use std::path::PathBuf; use std::time::Duration; use artcraft_client::credentials::storyteller_credential_set::StorytellerCredentialSet; @@ -378,8 +376,7 @@ async fn download_spz( info!("Writing to path: {:?}", download_path); - let mut file = File::create(&download_path)?; - file.write_all(&image_bytes)?; + tokio::fs::write(&download_path, &image_bytes).await?; Ok(download_path) } diff --git a/crates/schema/database/sqlite_tasks/Cargo.toml b/crates/schema/database/sqlite_tasks/Cargo.toml index aa9c83b3ed..5a2f4c3742 100644 --- a/crates/schema/database/sqlite_tasks/Cargo.toml +++ b/crates/schema/database/sqlite_tasks/Cargo.toml @@ -19,6 +19,7 @@ tokens.workspace = true anyhow.workspace = true chrono.workspace = true log.workspace = true +tokio = { workspace = true, features = ["fs"] } # TODO(bt,2025-07-09): Update sqlx ASAP. We're stuck on 0.7 because of the complex use of internal types and macros in the database crate. # We're going to embed in-memory SQLite diff --git a/crates/schema/database/sqlite_tasks/src/connection.rs b/crates/schema/database/sqlite_tasks/src/connection.rs index bd9af2bbb7..124589732e 100644 --- a/crates/schema/database/sqlite_tasks/src/connection.rs +++ b/crates/schema/database/sqlite_tasks/src/connection.rs @@ -22,7 +22,7 @@ impl TaskDbConnection { info!("Deleting and recreating SQLite database at {:?}", database_file.as_ref()); - if let Err(err) = std::fs::remove_file(&database_file) { + if let Err(err) = tokio::fs::remove_file(&database_file).await { error!("Error deleting SQLite database file: {:?}", err); } diff --git a/frontend/api_docs.html b/frontend/api_docs.html index a5c0ebb87b..6631f88bd9 100644 --- a/frontend/api_docs.html +++ b/frontend/api_docs.html @@ -5,14 +5,14 @@ Storyteller API - +
- - + +