From 91ad838f3e48988ef915f7d5e034ee5f76d7bc9c Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 30 Mar 2026 14:31:06 -0400 Subject: [PATCH] dummy data, rename migrations --- .../down.sql | 0 .../2026-03-29-150019-0000_characters/up.sql | 0 .../down.sql | 0 .../up.sql | 0 .../down.sql | 0 .../up.sql | 0 .../down.sql | 0 .../up.sql | 0 .../characters/get_character_handler.rs | 47 ++++++++--- .../characters/list_characters_handler.rs | 78 ++++++++++++++----- 10 files changed, 95 insertions(+), 30 deletions(-) rename _database/sql/{migrations => migrations_todo}/2026-03-29-150019-0000_characters/down.sql (100%) rename _database/sql/{migrations => migrations_todo}/2026-03-29-150019-0000_characters/up.sql (100%) rename _database/sql/{migrations => migrations_todo}/2026-03-29-150026-0000_character_third_party_entities/down.sql (100%) rename _database/sql/{migrations => migrations_todo}/2026-03-29-150026-0000_character_third_party_entities/up.sql (100%) rename _database/sql/{migrations => migrations_todo}/2026-03-29-150034-0000_character_creation_assets/down.sql (100%) rename _database/sql/{migrations => migrations_todo}/2026-03-29-150034-0000_character_creation_assets/up.sql (100%) rename _database/sql/{migrations => migrations_todo}/2026-03-29-150042-0000_character_creation_prompts/down.sql (100%) rename _database/sql/{migrations => migrations_todo}/2026-03-29-150042-0000_character_creation_prompts/up.sql (100%) diff --git a/_database/sql/migrations/2026-03-29-150019-0000_characters/down.sql b/_database/sql/migrations_todo/2026-03-29-150019-0000_characters/down.sql similarity index 100% rename from _database/sql/migrations/2026-03-29-150019-0000_characters/down.sql rename to _database/sql/migrations_todo/2026-03-29-150019-0000_characters/down.sql diff --git a/_database/sql/migrations/2026-03-29-150019-0000_characters/up.sql b/_database/sql/migrations_todo/2026-03-29-150019-0000_characters/up.sql similarity index 100% rename from _database/sql/migrations/2026-03-29-150019-0000_characters/up.sql rename to _database/sql/migrations_todo/2026-03-29-150019-0000_characters/up.sql diff --git a/_database/sql/migrations/2026-03-29-150026-0000_character_third_party_entities/down.sql b/_database/sql/migrations_todo/2026-03-29-150026-0000_character_third_party_entities/down.sql similarity index 100% rename from _database/sql/migrations/2026-03-29-150026-0000_character_third_party_entities/down.sql rename to _database/sql/migrations_todo/2026-03-29-150026-0000_character_third_party_entities/down.sql diff --git a/_database/sql/migrations/2026-03-29-150026-0000_character_third_party_entities/up.sql b/_database/sql/migrations_todo/2026-03-29-150026-0000_character_third_party_entities/up.sql similarity index 100% rename from _database/sql/migrations/2026-03-29-150026-0000_character_third_party_entities/up.sql rename to _database/sql/migrations_todo/2026-03-29-150026-0000_character_third_party_entities/up.sql diff --git a/_database/sql/migrations/2026-03-29-150034-0000_character_creation_assets/down.sql b/_database/sql/migrations_todo/2026-03-29-150034-0000_character_creation_assets/down.sql similarity index 100% rename from _database/sql/migrations/2026-03-29-150034-0000_character_creation_assets/down.sql rename to _database/sql/migrations_todo/2026-03-29-150034-0000_character_creation_assets/down.sql diff --git a/_database/sql/migrations/2026-03-29-150034-0000_character_creation_assets/up.sql b/_database/sql/migrations_todo/2026-03-29-150034-0000_character_creation_assets/up.sql similarity index 100% rename from _database/sql/migrations/2026-03-29-150034-0000_character_creation_assets/up.sql rename to _database/sql/migrations_todo/2026-03-29-150034-0000_character_creation_assets/up.sql diff --git a/_database/sql/migrations/2026-03-29-150042-0000_character_creation_prompts/down.sql b/_database/sql/migrations_todo/2026-03-29-150042-0000_character_creation_prompts/down.sql similarity index 100% rename from _database/sql/migrations/2026-03-29-150042-0000_character_creation_prompts/down.sql rename to _database/sql/migrations_todo/2026-03-29-150042-0000_character_creation_prompts/down.sql diff --git a/_database/sql/migrations/2026-03-29-150042-0000_character_creation_prompts/up.sql b/_database/sql/migrations_todo/2026-03-29-150042-0000_character_creation_prompts/up.sql similarity index 100% rename from _database/sql/migrations/2026-03-29-150042-0000_character_creation_prompts/up.sql rename to _database/sql/migrations_todo/2026-03-29-150042-0000_character_creation_prompts/up.sql diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/get_character_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/get_character_handler.rs index d9c1538a79..49483b113f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/get_character_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/get_character_handler.rs @@ -2,12 +2,18 @@ use std::sync::Arc; use actix_web::web::{Json, Path}; use actix_web::{web, HttpRequest}; +use log::warn; use artcraft_api_defs::characters::get_character::{GetCharacterDetails, GetCharacterPathInfo, GetCharacterResponse}; +use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; use enums::common::generation::common_model_type::CommonModelType; +use mysql_queries::queries::media_files::get::get_media_file::get_media_file; use tokens::tokens::characters::CharacterToken; +use tokens::tokens::media_files::MediaFileToken; +use crate::http_server::common_responses::media::media_links_builder::MediaLinksBuilder; use crate::http_server::common_responses::common_web_error::CommonWebError; +use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; use crate::state::server_state::ServerState; /// Get a character by token. @@ -25,22 +31,45 @@ use crate::state::server_state::ServerState; ) )] pub async fn get_character_handler( - _http_request: HttpRequest, + http_request: HttpRequest, path: Path, - _server_state: web::Data>, + server_state: web::Data>, ) -> Result, CommonWebError> { - // TODO: Replace with real implementation. - let mock_character = GetCharacterDetails { + // TODO: Replace with real character query. This is test data using a real media file (Ernest). + + let media_domain = get_media_domain(&http_request); + let ernest_media_token = MediaFileToken::new_from_str("m_1997908e4tcbaj34wa0s5bvr4y4szt"); + + let maybe_links = match get_media_file(&ernest_media_token, false, &server_state.mysql_pool).await { + Ok(Some(record)) => { + let path = MediaFileBucketPath::from_object_hash( + &record.public_bucket_directory_hash, + record.maybe_public_bucket_prefix.as_deref(), + record.maybe_public_bucket_extension.as_deref(), + ); + Some(MediaLinksBuilder::from_media_path_and_env(media_domain, server_state.server_environment, &path)) + } + Ok(None) => { + warn!("Ernest media file not found in database"); + None + } + Err(err) => { + warn!("Failed to look up Ernest media file: {:?}", err); + None + } + }; + + let character = GetCharacterDetails { token: path.character_token.clone(), models: vec![CommonModelType::Seedance2p0], - name: "Mock Character".to_string(), - maybe_description: Some("This is a mock character for development.".to_string()), - maybe_avatar: None, - maybe_full_image: None, + name: "Ernest".to_string(), + maybe_description: Some("Ernest P. Worrell".to_string()), + maybe_avatar: maybe_links.clone(), + maybe_full_image: maybe_links, }; Ok(Json(GetCharacterResponse { success: true, - character: mock_character, + character, })) } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/list_characters_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/list_characters_handler.rs index 9a58595b99..4d66226bb6 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/list_characters_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/list_characters_handler.rs @@ -2,12 +2,18 @@ use std::sync::Arc; use actix_web::web::{Json, Query}; use actix_web::{web, HttpRequest}; +use log::warn; use artcraft_api_defs::characters::list_characters::{ListCharactersEntry, ListCharactersQuery, ListCharactersResponse}; +use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; use enums::common::generation::common_model_type::CommonModelType; +use mysql_queries::queries::media_files::get::batch_get_media_files_by_tokens::batch_get_media_files_by_tokens; use tokens::tokens::characters::CharacterToken; +use tokens::tokens::media_files::MediaFileToken; +use crate::http_server::common_responses::media::media_links_builder::MediaLinksBuilder; use crate::http_server::common_responses::common_web_error::CommonWebError; +use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; use crate::state::server_state::ServerState; /// List characters for the current session. @@ -23,33 +29,63 @@ use crate::state::server_state::ServerState; ), )] pub async fn list_characters_handler( - _http_request: HttpRequest, + http_request: HttpRequest, _query: Query, - _server_state: web::Data>, + server_state: web::Data>, ) -> Result, CommonWebError> { - // TODO: Replace with real implementation. - let mock_characters = vec![ - ListCharactersEntry { - token: CharacterToken::new_from_str("character_mock_abc123"), - models: vec![CommonModelType::Seedance2p0], - name: "Juno".to_string(), - maybe_description: Some("Juno the shiba inu".to_string()), - maybe_avatar: None, - maybe_full_image: None, - }, - ListCharactersEntry { - token: CharacterToken::new_from_str("character_mock_def456"), - models: vec![CommonModelType::Seedance2p0], - name: "Ernest".to_string(), - maybe_description: Some("Ernest P. Worrell".to_string()), - maybe_avatar: None, - maybe_full_image: None, - }, + // TODO: Replace with real character queries. This is test data using real media files. + + let media_domain = get_media_domain(&http_request); + + struct TestCharacter { + token: &'static str, + name: &'static str, + description: &'static str, + media_token: &'static str, + } + + let test_characters = vec![ + TestCharacter { token: "character_mock_ernest_001", name: "Ernest", description: "Ernest P. Worrell", media_token: "m_1997908e4tcbaj34wa0s5bvr4y4szt" }, + TestCharacter { token: "character_mock_juno_002", name: "Juno", description: "Juno the corgi", media_token: "m_m1bz02z1kkzanxy6rb4vk1kvq9de9g" }, + TestCharacter { token: "character_mock_mochi_003", name: "Mochi", description: "Mochi with glasses", media_token: "m_5y81rcnpnrbey55da6cc2s9z4d2f45" }, ]; + let media_tokens: Vec = test_characters.iter() + .map(|c| MediaFileToken::new_from_str(c.media_token)) + .collect(); + + let media_records = batch_get_media_files_by_tokens(&server_state.mysql_pool, &media_tokens, false) + .await + .unwrap_or_else(|err| { + warn!("Failed to look up media files for test characters: {:?}", err); + vec![] + }); + + let characters = test_characters.iter().map(|tc| { + let maybe_links = media_records.iter() + .find(|r| r.token.as_str() == tc.media_token) + .map(|r| { + let path = MediaFileBucketPath::from_object_hash( + &r.public_bucket_directory_hash, + r.maybe_public_bucket_prefix.as_deref(), + r.maybe_public_bucket_extension.as_deref(), + ); + MediaLinksBuilder::from_media_path_and_env(media_domain, server_state.server_environment, &path) + }); + + ListCharactersEntry { + token: CharacterToken::new_from_str(tc.token), + models: vec![CommonModelType::Seedance2p0], + name: tc.name.to_string(), + maybe_description: Some(tc.description.to_string()), + maybe_avatar: maybe_links.clone(), + maybe_full_image: maybe_links, + } + }).collect(); + Ok(Json(ListCharactersResponse { success: true, - characters: mock_characters, + characters, next_cursor: None, })) }