From 418d824c3563ba01ddbcd68abf53b0313cd5d1d5 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 15 Apr 2025 22:43:53 -0400 Subject: [PATCH] session jobs for anonymous users --- .../web/list_session_jobs.rs | 35 ++++++++++++++----- .../list/list_session_jobs_handler.rs | 24 +++++++++---- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/crates/lib/mysql_queries/src/queries/generic_inference/web/list_session_jobs.rs b/crates/lib/mysql_queries/src/queries/generic_inference/web/list_session_jobs.rs index 9dc47bfc34..3f70d4298d 100644 --- a/crates/lib/mysql_queries/src/queries/generic_inference/web/list_session_jobs.rs +++ b/crates/lib/mysql_queries/src/queries/generic_inference/web/list_session_jobs.rs @@ -21,9 +21,14 @@ use crate::helpers::boolean_converters::i8_to_bool; use crate::payloads::generic_inference_args::generic_inference_args::{GenericInferenceArgs, PolymorphicInferenceArgs}; use crate::queries::generic_inference::web::job_status::{GenericInferenceJobStatus, RequestDetails, ResultDetails, UserDetails}; +pub enum SessionUser<'a> { + User(&'a UserToken), + Anonymous(&'a AnonymousVisitorTrackingToken), +} + pub struct ListSessionJobsForUserArgs<'a> { // TODO(bt,2024-04-23): Support AnonymousVisitorToken - pub user_token: &'a UserToken, + pub user: SessionUser<'a>, pub maybe_include_job_statuses: Option<&'a HashSet>, pub maybe_exclude_job_statuses: Option<&'a HashSet>, } @@ -63,14 +68,26 @@ pub async fn list_session_jobs_from_connection( // Furthermore, even though the join query's `created_at` lacks an index, sort // by id will accomplish this quickly. { - query_builder.push(r#" - INNER JOIN ( - SELECT id - FROM generic_inference_jobs - WHERE maybe_creator_user_token = - "#); - - query_builder.push_bind(args.user_token.to_string()); + match args.user { + SessionUser::User(user_token) => { + query_builder.push(r#" + INNER JOIN ( + SELECT id + FROM generic_inference_jobs + WHERE maybe_creator_user_token = + "#); + query_builder.push_bind(user_token.to_string()); + } + SessionUser::Anonymous(avt_token) => { + query_builder.push(r#" + INNER JOIN ( + SELECT id + FROM generic_inference_jobs + WHERE maybe_creator_anonymous_visitor_token = + "#); + query_builder.push_bind(avt_token.to_string()); + } + } query_builder.push(r#" AND created_at > DATE_SUB(NOW(), INTERVAL 36 HOUR) diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/list/list_session_jobs_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/list/list_session_jobs_handler.rs index e669d71a70..15486494d7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/list/list_session_jobs_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/list/list_session_jobs_handler.rs @@ -31,7 +31,7 @@ use enums::by_table::generic_inference_jobs::inference_category::InferenceCatego use enums::common::job_status_plus::JobStatusPlus; use enums::no_table::style_transfer::style_transfer_name::StyleTransferName; use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus; -use mysql_queries::queries::generic_inference::web::list_session_jobs::{list_session_jobs_from_connection, ListSessionJobsForUserArgs}; +use mysql_queries::queries::generic_inference::web::list_session_jobs::{list_session_jobs_from_connection, ListSessionJobsForUserArgs, SessionUser}; use primitives::numerics::i64_to_u64_zero_clamped::i64_to_u64_zero_clamped; use redis_common::redis_keys::RedisKeys; use tokens::tokens::generic_inference_jobs::InferenceJobToken; @@ -238,11 +238,6 @@ pub async fn list_session_jobs_handler( ListSessionJobsError::ServerError })?; - let session = match maybe_user_session { - Some(session) => session, - None => return Err(ListSessionJobsError::NotAuthorized), - }; - let include_states = query.include_states .as_deref() .map(|s| s.split(",") @@ -255,8 +250,23 @@ pub async fn list_session_jobs_handler( .filter_map(|status| JobStatusPlus::from_str(status).ok()) .collect::>()); + let user; + + match (maybe_user_session.as_ref(), maybe_avt_token.as_ref()) { + (Some(session), _) => { + user = SessionUser::User(&session.user_token_typed); + } + (None, Some(avt_token)) => { + user = SessionUser::Anonymous(avt_token); + } + (None, None) => { + // TODO(bt,2025-04-15): We should install an AVT cookie. + return Err(ListSessionJobsError::NotAuthorized); + } + } + let args = ListSessionJobsForUserArgs { - user_token: &session.user_token_typed, + user, maybe_include_job_statuses: include_states.as_ref(), maybe_exclude_job_statuses: exclude_states.as_ref(), };