diff --git a/crates/service/web/storyteller_web/src/docs/api_doc.rs b/crates/service/web/storyteller_web/src/docs/api_doc.rs index f92f637378..43b2d184a5 100644 --- a/crates/service/web/storyteller_web/src/docs/api_doc.rs +++ b/crates/service/web/storyteller_web/src/docs/api_doc.rs @@ -676,7 +676,6 @@ use crate::http_server::endpoints::media_files::list::list_batch_generated_redux DeleteWeightError, DeleteWeightPathInfo, DeleteWeightRequest, - DismissFinishedSessionJobsError, DismissFinishedSessionJobsSuccessResponse, EditBetaKeyDistributedFlagError, EditBetaKeyDistributedFlagPathInfo, diff --git a/crates/service/web/storyteller_web/src/http_server/common_responses/common_web_error.rs b/crates/service/web/storyteller_web/src/http_server/common_responses/common_web_error.rs index e151b63521..8a7e8e6954 100644 --- a/crates/service/web/storyteller_web/src/http_server/common_responses/common_web_error.rs +++ b/crates/service/web/storyteller_web/src/http_server/common_responses/common_web_error.rs @@ -1,9 +1,10 @@ use actix_http::StatusCode; use actix_web::{HttpResponse, HttpResponseBuilder, ResponseError}; -use log::error; +use log::{error, warn}; use mysql_queries::errors::mysql_error::{MysqlCrateErrorSubtype, MysqlError}; use std::error::Error; use std::fmt::{Display, Formatter}; +use crate::http_server::web_utils::user_session::require_user_session::RequireUserSessionError; #[derive(Debug, utoipa::ToSchema)] pub enum CommonWebError { @@ -99,6 +100,15 @@ impl From> for CommonWebError { } } +impl From for CommonWebError { + fn from(value: RequireUserSessionError) -> Self { + match value { + RequireUserSessionError::NotAuthorized => Self::NotAuthorized, + RequireUserSessionError::ServerError => Self::ServerError, + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/delete/dismiss_finished_session_jobs_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/delete/dismiss_finished_session_jobs_handler.rs index fb3c3e0970..5c3a6dffa8 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/delete/dismiss_finished_session_jobs_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/delete/dismiss_finished_session_jobs_handler.rs @@ -1,16 +1,13 @@ -use std::fmt; use std::sync::Arc; -use actix_web::error::ResponseError; -use actix_web::http::StatusCode; -use actix_web::{web, HttpMessage, HttpRequest, HttpResponse}; -use log::{error, warn}; +use actix_web::{web, HttpMessage, HttpRequest}; +use actix_web::web::Json; +use log::error; use utoipa::ToSchema; use mysql_queries::queries::generic_inference::web::dismiss_finished_jobs_for_user::dismiss_finished_jobs_for_user; -use mysql_queries::queries::generic_inference::web::mark_generic_inference_job_cancelled_by_user::mark_generic_inference_job_cancelled_by_user; -use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; +use crate::http_server::common_responses::common_web_error::CommonWebError; use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; @@ -19,40 +16,6 @@ pub struct DismissFinishedSessionJobsSuccessResponse { pub success: bool, } -#[derive(Debug, ToSchema)] -pub enum DismissFinishedSessionJobsError { - ServerError, - NotFound, - NotAuthorized, -} - -impl ResponseError for DismissFinishedSessionJobsError { - fn status_code(&self) -> StatusCode { - match *self { - DismissFinishedSessionJobsError::ServerError => StatusCode::INTERNAL_SERVER_ERROR, - DismissFinishedSessionJobsError::NotFound => StatusCode::NOT_FOUND, - DismissFinishedSessionJobsError::NotAuthorized => StatusCode::UNAUTHORIZED, - } - } - - fn error_response(&self) -> HttpResponse { - let error_reason = match self { - Self::ServerError => "server error".to_string(), - Self::NotFound => "not found".to_string(), - Self::NotAuthorized => "unauthorized".to_string(), - }; - - to_simple_json_error(&error_reason, self.status_code()) - } -} - -// NB: Not using derive_more::Display since Clion doesn't understand it. -impl fmt::Display for DismissFinishedSessionJobsError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self) - } -} - /// Mark all jobs that are finished (or that failed completely and will not retry) as dismissed. /// /// This will prevent these jobs from being returned in the "list session jobs" endpoint. @@ -62,46 +25,33 @@ impl fmt::Display for DismissFinishedSessionJobsError { path = "/v1/jobs/session/dismiss_finished", responses( (status = 200, body = DismissFinishedSessionJobsSuccessResponse), - (status = 500, body = DismissFinishedSessionJobsError), + (status = 401, body = CommonWebError), + (status = 500, body = CommonWebError), ), )] pub async fn dismiss_finished_session_jobs_handler( http_request: HttpRequest, - server_state: web::Data>) -> Result + server_state: web::Data>) -> Result, CommonWebError> { + let user_session = require_user_session(&http_request, &server_state) + .await?; + // TODO(bt,2024-06-16): Reuse connection let mut mysql_connection = server_state.mysql_pool.acquire() .await .map_err(|e| { - warn!("Could not acquire DB pool: {:?}", e); - DismissFinishedSessionJobsError::ServerError - })?; - - let user_session = require_user_session(&http_request, &server_state) - .await - .map_err(|e| { - warn!("Session checker error: {:?}", e); - DismissFinishedSessionJobsError::ServerError + error!("Could not acquire DB pool: {:?}", e); + CommonWebError::ServerError })?; dismiss_finished_jobs_for_user(&mut mysql_connection, &user_session.user_token) .await .map_err(|err| { error!("tts job query error: {:?}", err); - DismissFinishedSessionJobsError::ServerError + CommonWebError::ServerError })?; - let response = DismissFinishedSessionJobsSuccessResponse { + Ok(Json(DismissFinishedSessionJobsSuccessResponse { success: true, - }; - - let body = serde_json::to_string(&response) - .map_err(|e| { - error!("error returning response: {:?}", e); - DismissFinishedSessionJobsError::ServerError - })?; - - Ok(HttpResponse::Ok() - .content_type("application/json") - .body(body)) + })) }