mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-07 02:21:23 +00:00
Merge pull request #7 from storytold/echelon-more-pooled-connections
Echelon more pooled connections
This commit is contained in:
11 files changed
+184
-120
No files matched your search
+15
-5
@@ -3,7 +3,8 @@ use chrono::{DateTime, Utc};
|
||||
use container_common::anyhow_result::AnyhowResult;
|
||||
use crate::helpers::boolean_converters::{i8_to_bool, nullable_i8_to_optional_bool};
|
||||
use log::{warn, info};
|
||||
use sqlx::MySqlPool;
|
||||
use sqlx::{MySql, MySqlPool};
|
||||
use sqlx::pool::PoolConnection;
|
||||
|
||||
/// List of categories
|
||||
/// This is *NOT* paginated, as that defeats the purpose of having a category system.
|
||||
@@ -118,12 +119,21 @@ impl ListCategoriesQueryBuilder {
|
||||
}
|
||||
|
||||
/// Perform the query based on the set predicates.
|
||||
#[deprecated = "Use the PoolConnection<MySql> method instead of the MySqlPool one."]
|
||||
pub async fn perform_query(
|
||||
&self,
|
||||
mysql_pool: &MySqlPool
|
||||
mysql_pool: &MySqlPool,
|
||||
) -> AnyhowResult<CategoryList> {
|
||||
let mut mysql_connection = mysql_pool.acquire().await?;
|
||||
self.perform_query_using_connection(&mut mysql_connection).await
|
||||
}
|
||||
|
||||
let internal_results = self.perform_internal_query(mysql_pool).await?;
|
||||
/// Perform the query based on the set predicates.
|
||||
pub async fn perform_query_using_connection(
|
||||
&self,
|
||||
mysql_connection: &mut PoolConnection<MySql>,
|
||||
) -> AnyhowResult<CategoryList> {
|
||||
let internal_results = self.perform_internal_query(mysql_connection).await?;
|
||||
|
||||
let categories = internal_results
|
||||
.into_iter()
|
||||
@@ -158,7 +168,7 @@ impl ListCategoriesQueryBuilder {
|
||||
/// Perform the query based on the set predicates.
|
||||
async fn perform_internal_query(
|
||||
&self,
|
||||
mysql_pool: &MySqlPool
|
||||
mysql_connection: &mut PoolConnection<MySql>
|
||||
) -> AnyhowResult<Vec<RawInternalCategoryRecord>> {
|
||||
|
||||
let query = self.build_query_string();
|
||||
@@ -174,7 +184,7 @@ impl ListCategoriesQueryBuilder {
|
||||
query = query.bind(model_type);
|
||||
}
|
||||
|
||||
let mut results = query.fetch_all(mysql_pool)
|
||||
let mut results = query.fetch_all(mysql_connection)
|
||||
.await?;
|
||||
|
||||
Ok(results)
|
||||
|
||||
+3
-2
@@ -1,7 +1,8 @@
|
||||
use anyhow::anyhow;
|
||||
use container_common::anyhow_result::AnyhowResult;
|
||||
use log::warn;
|
||||
use sqlx::MySqlPool;
|
||||
use sqlx::{MySql, MySqlPool};
|
||||
use sqlx::pool::PoolConnection;
|
||||
|
||||
#[derive(Serialize)]
|
||||
pub struct TtsLeaderboardRecordForList {
|
||||
@@ -23,7 +24,7 @@ struct TtsLeaderboardRecordForListRaw {
|
||||
|
||||
// NB: This may need to become an offline query if it is expensive.
|
||||
pub async fn calculate_tts_model_leaderboard(
|
||||
mysql_pool: &MySqlPool
|
||||
mysql_pool: &mut PoolConnection<MySql>
|
||||
) -> AnyhowResult<Vec<TtsLeaderboardRecordForList>> {
|
||||
|
||||
// NB: We're not requiring "is_public_listing_approved IS TRUE" for TTS models
|
||||
|
||||
+15
-4
@@ -3,7 +3,8 @@ use chrono::{DateTime, Utc};
|
||||
use container_common::anyhow_result::AnyhowResult;
|
||||
use crate::helpers::boolean_converters::{i8_to_bool, nullable_i8_to_optional_bool};
|
||||
use log::{warn, info};
|
||||
use sqlx::MySqlPool;
|
||||
use sqlx::{MySql, MySqlPool};
|
||||
use sqlx::pool::PoolConnection;
|
||||
|
||||
/// List of assigned categories for a TTS model
|
||||
/// This is *NOT* paginated, as that defeats the purpose of having a category system.
|
||||
@@ -94,12 +95,22 @@ impl ListAssignedTtsCategoriesQueryBuilder {
|
||||
}
|
||||
|
||||
/// Perform the query based on the set predicates.
|
||||
#[deprecated = "Use the PoolConnection<MySql> method instead of the MySqlPool one."]
|
||||
pub async fn perform_query(
|
||||
&self,
|
||||
mysql_pool: &MySqlPool
|
||||
) -> AnyhowResult<AssignedCategoryList> {
|
||||
let mut mysql_connection = mysql_pool.acquire().await?;
|
||||
self.perform_query_by_connection(&mut mysql_connection).await
|
||||
}
|
||||
|
||||
let internal_results = self.perform_internal_query(mysql_pool).await?;
|
||||
/// Perform the query based on the set predicates.
|
||||
pub async fn perform_query_by_connection(
|
||||
&self,
|
||||
mysql_connection: &mut PoolConnection<MySql>
|
||||
) -> AnyhowResult<AssignedCategoryList> {
|
||||
|
||||
let internal_results = self.perform_internal_query(mysql_connection).await?;
|
||||
|
||||
let categories = internal_results
|
||||
.into_iter()
|
||||
@@ -137,7 +148,7 @@ impl ListAssignedTtsCategoriesQueryBuilder {
|
||||
/// Perform the query based on the set predicates.
|
||||
async fn perform_internal_query(
|
||||
&self,
|
||||
mysql_pool: &MySqlPool
|
||||
mysql_connection: &mut PoolConnection<MySql>
|
||||
) -> AnyhowResult<Vec<RawInternalCategoryRecord>> {
|
||||
|
||||
let query = self.build_query_string();
|
||||
@@ -148,7 +159,7 @@ impl ListAssignedTtsCategoriesQueryBuilder {
|
||||
// NB: Model token is always used for scoping.
|
||||
query = query.bind(&self.scope_tts_model_token);
|
||||
|
||||
let mut results = query.fetch_all(mysql_pool)
|
||||
let mut results = query.fetch_all(mysql_connection)
|
||||
.await?;
|
||||
|
||||
Ok(results)
|
||||
|
||||
@@ -10,7 +10,8 @@ use crate::column_types::record_visibility::RecordVisibility;
|
||||
use crate::column_types::vocoder_type::VocoderType;
|
||||
use crate::helpers::boolean_converters::i8_to_bool;
|
||||
use log::warn;
|
||||
use sqlx::MySqlPool;
|
||||
use sqlx::pool::PoolConnection;
|
||||
use sqlx::{MySql, MySqlPool};
|
||||
|
||||
// FIXME: This is the old style of query scoping and shouldn't be copied.
|
||||
// The moderator-only fields are good practice, though.
|
||||
@@ -76,16 +77,26 @@ pub struct TtsModelModeratorFields {
|
||||
// FIXME: This is the old style of query scoping and shouldn't be copied.
|
||||
// The moderator-only fields are good practice, though.
|
||||
|
||||
|
||||
pub async fn get_tts_model_by_token(
|
||||
tts_model_token: &str,
|
||||
can_see_deleted: bool,
|
||||
mysql_pool: &MySqlPool
|
||||
) -> AnyhowResult<Option<TtsModelRecord>> {
|
||||
let mut connection = mysql_pool.acquire().await?;
|
||||
get_tts_model_by_token_using_connection(tts_model_token, can_see_deleted, &mut connection).await
|
||||
}
|
||||
|
||||
pub async fn get_tts_model_by_token_using_connection(
|
||||
tts_model_token: &str,
|
||||
can_see_deleted: bool,
|
||||
mysql_connection: &mut PoolConnection<MySql>
|
||||
) -> AnyhowResult<Option<TtsModelRecord>> {
|
||||
|
||||
let maybe_record = if can_see_deleted {
|
||||
select_including_deleted(tts_model_token, mysql_pool).await
|
||||
select_including_deleted(tts_model_token, mysql_connection).await
|
||||
} else {
|
||||
select_without_deleted(tts_model_token, mysql_pool).await
|
||||
select_without_deleted(tts_model_token, mysql_connection).await
|
||||
};
|
||||
|
||||
let model : InternalTtsModelRecordRaw = match maybe_record {
|
||||
@@ -161,7 +172,7 @@ pub async fn get_tts_model_by_token(
|
||||
|
||||
async fn select_including_deleted(
|
||||
tts_model_token: &str,
|
||||
mysql_pool: &MySqlPool
|
||||
mysql_connection: &mut PoolConnection<MySql>
|
||||
) -> Result<InternalTtsModelRecordRaw, sqlx::Error> {
|
||||
sqlx::query_as!(
|
||||
InternalTtsModelRecordRaw,
|
||||
@@ -224,13 +235,13 @@ WHERE tts.token = ?
|
||||
"#,
|
||||
tts_model_token
|
||||
)
|
||||
.fetch_one(mysql_pool)
|
||||
.fetch_one(mysql_connection)
|
||||
.await // TODO: This will return error if it doesn't exist
|
||||
}
|
||||
|
||||
async fn select_without_deleted(
|
||||
tts_model_token: &str,
|
||||
mysql_pool: &MySqlPool
|
||||
mysql_connection: &mut PoolConnection<MySql>
|
||||
) -> Result<InternalTtsModelRecordRaw, sqlx::Error> {
|
||||
sqlx::query_as!(
|
||||
InternalTtsModelRecordRaw,
|
||||
@@ -296,7 +307,7 @@ WHERE
|
||||
"#,
|
||||
tts_model_token
|
||||
)
|
||||
.fetch_one(mysql_pool)
|
||||
.fetch_one(mysql_connection)
|
||||
.await // TODO: This will return error if it doesn't exist
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -1,7 +1,8 @@
|
||||
use anyhow::anyhow;
|
||||
use container_common::anyhow_result::AnyhowResult;
|
||||
use log::warn;
|
||||
use sqlx::MySqlPool;
|
||||
use sqlx::{MySql, MySqlPool};
|
||||
use sqlx::pool::PoolConnection;
|
||||
|
||||
#[derive(Serialize)]
|
||||
pub struct W2lLeaderboardRecordForList {
|
||||
@@ -23,7 +24,7 @@ struct W2lLeaderboardRecordForListRaw {
|
||||
|
||||
// NB: This may need to become an offline query if it is expensive.
|
||||
pub async fn calculate_w2l_template_leaderboard(
|
||||
mysql_pool: &MySqlPool
|
||||
mysql_pool: &mut PoolConnection<MySql>
|
||||
) -> AnyhowResult<Vec<W2lLeaderboardRecordForList>> {
|
||||
|
||||
// NB: We're requiring "is_public_listing_approved IS TRUE" for W2L templates!
|
||||
|
||||
+17
-21
@@ -1,27 +1,17 @@
|
||||
use actix_http::Error;
|
||||
use actix_http::http::header;
|
||||
use actix_web::HttpResponseBuilder;
|
||||
use actix_web::cookie::Cookie;
|
||||
// NB: Incrementally getting rid of build warnings...
|
||||
#![forbid(unused_imports)]
|
||||
#![forbid(unused_mut)]
|
||||
#![forbid(unused_variables)]
|
||||
|
||||
use actix_web::error::ResponseError;
|
||||
use actix_web::http::StatusCode;
|
||||
use actix_web::web::{Path, Json};
|
||||
use actix_web::{Responder, web, HttpResponse, error, HttpRequest};
|
||||
use actix_web::{web, HttpResponse, HttpRequest};
|
||||
use chrono::{DateTime, Utc};
|
||||
use crate::http_server::web_utils::ip_address::get_request_ip;
|
||||
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
|
||||
use crate::http_server::web_utils::response_success_helpers::simple_json_success;
|
||||
use crate::server_state::ServerState;
|
||||
use crate::util::email_to_gravatar::email_to_gravatar;
|
||||
use crate::util::markdown_to_html::markdown_to_html;
|
||||
use database_queries::queries::model_categories::list_categories_query_builder::ListCategoriesQueryBuilder;
|
||||
use http_server_common::response::serialize_as_json_error::serialize_as_json_error;
|
||||
use lexical_sort::natural_lexical_cmp;
|
||||
use log::{info, warn, log, error};
|
||||
use regex::Regex;
|
||||
use sqlx::MySqlPool;
|
||||
use sqlx::error::DatabaseError;
|
||||
use sqlx::error::Error::Database;
|
||||
use sqlx::mysql::MySqlDatabaseError;
|
||||
use log::{info, warn, error};
|
||||
use std::fmt;
|
||||
use std::sync::Arc;
|
||||
|
||||
@@ -96,7 +86,7 @@ impl fmt::Display for ListTtsCategoriesError {
|
||||
// =============== Handler ===============
|
||||
|
||||
pub async fn list_tts_categories_handler(
|
||||
http_request: HttpRequest,
|
||||
_http_request: HttpRequest,
|
||||
server_state: web::Data<Arc<ServerState>>) -> Result<HttpResponse, ListTtsCategoriesError>
|
||||
{
|
||||
let maybe_categories = server_state.caches.category_list.copy_without_bump_if_unexpired()
|
||||
@@ -111,13 +101,20 @@ pub async fn list_tts_categories_handler(
|
||||
categories
|
||||
},
|
||||
None => {
|
||||
let mut mysql_connection = server_state.mysql_pool.acquire()
|
||||
.await
|
||||
.map_err(|e| {
|
||||
warn!("Could not acquire DB pool: {:?}", e);
|
||||
ListTtsCategoriesError::ServerError
|
||||
})?;
|
||||
|
||||
let query_builder = ListCategoriesQueryBuilder::new()
|
||||
.show_deleted(false)
|
||||
.show_unapproved(false)
|
||||
.scope_model_type(Some("tts"));
|
||||
|
||||
let query_result =
|
||||
query_builder.perform_query(&server_state.mysql_pool).await;
|
||||
query_builder.perform_query_using_connection(&mut mysql_connection).await;
|
||||
|
||||
let results = match query_result {
|
||||
Ok(results) => results,
|
||||
@@ -163,14 +160,13 @@ pub async fn list_tts_categories_handler(
|
||||
},
|
||||
};
|
||||
|
||||
// TODO: Cache results in Redis w/ TTL.
|
||||
let response = ListTtsCategoriesResponse {
|
||||
success: true,
|
||||
categories,
|
||||
};
|
||||
|
||||
let body = serde_json::to_string(&response)
|
||||
.map_err(|e| ListTtsCategoriesError::ServerError)?;
|
||||
.map_err(|_e| ListTtsCategoriesError::ServerError)?;
|
||||
|
||||
Ok(HttpResponse::Ok()
|
||||
.content_type("application/json")
|
||||
|
||||
+27
-26
@@ -1,23 +1,17 @@
|
||||
use actix_http::Error;
|
||||
use actix_http::http::header;
|
||||
use actix_web::HttpResponseBuilder;
|
||||
use actix_web::cookie::Cookie;
|
||||
// NB: Incrementally getting rid of build warnings...
|
||||
#![forbid(unused_imports)]
|
||||
#![forbid(unused_mut)]
|
||||
#![forbid(unused_variables)]
|
||||
|
||||
use actix_web::error::ResponseError;
|
||||
use actix_web::http::StatusCode;
|
||||
use actix_web::web::{Path, Json};
|
||||
use actix_web::{Responder, web, HttpResponse, error, HttpRequest};
|
||||
use actix_web::web::Path;
|
||||
use actix_web::{web, HttpResponse, HttpRequest};
|
||||
use chrono::{DateTime, Utc};
|
||||
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
|
||||
use crate::http_server::web_utils::response_success_helpers::simple_json_success;
|
||||
use crate::server_state::ServerState;
|
||||
use database_queries::queries::tts::tts_category_assignments::list_assigned_tts_categories_query_builder::ListAssignedTtsCategoriesQueryBuilder;
|
||||
use http_server_common::response::serialize_as_json_error::serialize_as_json_error;
|
||||
use log::{info, warn, log};
|
||||
use regex::Regex;
|
||||
use sqlx::MySqlPool;
|
||||
use sqlx::error::DatabaseError;
|
||||
use sqlx::error::Error::Database;
|
||||
use sqlx::mysql::MySqlDatabaseError;
|
||||
use log::warn;
|
||||
use std::fmt;
|
||||
use std::sync::Arc;
|
||||
|
||||
@@ -100,9 +94,16 @@ pub async fn list_tts_model_assigned_categories_handler(
|
||||
path: Path<ListTtsModelAssignedCategoriesPathInfo>,
|
||||
server_state: web::Data<Arc<ServerState>>) -> Result<HttpResponse, ListTtsModelAssignedCategoriesError>
|
||||
{
|
||||
let mut mysql_connection = server_state.mysql_pool.acquire()
|
||||
.await
|
||||
.map_err(|e| {
|
||||
warn!("Could not acquire DB pool: {:?}", e);
|
||||
ListTtsModelAssignedCategoriesError::ServerError
|
||||
})?;
|
||||
|
||||
let maybe_user_session = server_state
|
||||
.session_checker
|
||||
.maybe_get_user_session(&http_request, &server_state.mysql_pool)
|
||||
.maybe_get_user_session_from_connection(&http_request, &mut mysql_connection)
|
||||
.await
|
||||
.map_err(|e| {
|
||||
warn!("Session checker error: {:?}", e);
|
||||
@@ -120,7 +121,7 @@ pub async fn list_tts_model_assigned_categories_handler(
|
||||
.show_unapproved(is_mod);
|
||||
|
||||
let query_result =
|
||||
query_builder.perform_query(&server_state.mysql_pool).await;
|
||||
query_builder.perform_query_by_connection(&mut mysql_connection).await;
|
||||
|
||||
let results = match query_result {
|
||||
Ok(results) => results,
|
||||
@@ -130,21 +131,21 @@ pub async fn list_tts_model_assigned_categories_handler(
|
||||
}
|
||||
};
|
||||
|
||||
let mut categories = results.categories.iter()
|
||||
let mut categories = results.categories.into_iter()
|
||||
.map(|c| {
|
||||
DisplayCategory {
|
||||
category_token: c.category_token.clone(),
|
||||
model_type: c.model_type.clone(),
|
||||
maybe_super_category_token: c.maybe_super_category_token.clone(),
|
||||
category_token: c.category_token,
|
||||
model_type: c.model_type,
|
||||
maybe_super_category_token: c.maybe_super_category_token,
|
||||
can_directly_have_models: c.can_directly_have_models,
|
||||
can_have_subcategories: c.can_have_subcategories,
|
||||
can_only_mods_apply: c.can_only_mods_apply,
|
||||
name: c.name.clone(),
|
||||
maybe_dropdown_name:c.maybe_dropdown_name.clone(),
|
||||
is_mod_approved: c.is_mod_approved.clone(),
|
||||
category_created_at: c.category_created_at.clone(),
|
||||
category_updated_at: c.category_updated_at.clone(),
|
||||
category_deleted_at: c.category_deleted_at.clone(),
|
||||
maybe_dropdown_name:c.maybe_dropdown_name,
|
||||
is_mod_approved: c.is_mod_approved,
|
||||
category_created_at: c.category_created_at,
|
||||
category_updated_at: c.category_updated_at,
|
||||
category_deleted_at: c.category_deleted_at,
|
||||
}
|
||||
})
|
||||
.collect::<Vec<DisplayCategory>>();
|
||||
@@ -158,7 +159,7 @@ pub async fn list_tts_model_assigned_categories_handler(
|
||||
};
|
||||
|
||||
let body = serde_json::to_string(&response)
|
||||
.map_err(|e| ListTtsModelAssignedCategoriesError::ServerError)?;
|
||||
.map_err(|_e| ListTtsModelAssignedCategoriesError::ServerError)?;
|
||||
|
||||
Ok(HttpResponse::Ok()
|
||||
.content_type("application/json")
|
||||
|
||||
+30
-17
@@ -1,24 +1,18 @@
|
||||
use actix_http::Error;
|
||||
use actix_http::http::header;
|
||||
use actix_web::HttpResponseBuilder;
|
||||
use actix_web::cookie::Cookie;
|
||||
// NB: Incrementally getting rid of build warnings...
|
||||
#![forbid(unused_imports)]
|
||||
#![forbid(unused_mut)]
|
||||
#![forbid(unused_variables)]
|
||||
|
||||
use actix_web::error::ResponseError;
|
||||
use actix_web::http::StatusCode;
|
||||
use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage};
|
||||
use chrono::{DateTime, Utc};
|
||||
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
|
||||
use actix_web::{web, HttpResponse, HttpRequest};
|
||||
use crate::http_server::web_utils::serialize_as_json_error::serialize_as_json_error;
|
||||
use crate::server_state::ServerState;
|
||||
use database_queries::queries::tts::stats::calculate_tts_model_leaderboard::TtsLeaderboardRecordForList;
|
||||
use database_queries::queries::tts::stats::calculate_tts_model_leaderboard::calculate_tts_model_leaderboard;
|
||||
use database_queries::queries::w2l::stats::calculate_w2l_template_leaderboard::W2lLeaderboardRecordForList;
|
||||
use database_queries::queries::w2l::stats::calculate_w2l_template_leaderboard::calculate_w2l_template_leaderboard;
|
||||
use log::{info, warn, log};
|
||||
use regex::Regex;
|
||||
use sqlx::MySqlPool;
|
||||
use sqlx::error::DatabaseError;
|
||||
use sqlx::error::Error::Database;
|
||||
use sqlx::mysql::MySqlDatabaseError;
|
||||
use log::warn;
|
||||
use std::fmt;
|
||||
use std::sync::Arc;
|
||||
|
||||
@@ -71,15 +65,34 @@ impl fmt::Display for LeaderboardErrorResponse {
|
||||
}
|
||||
|
||||
pub async fn leaderboard_handler(
|
||||
http_request: HttpRequest,
|
||||
_http_request: HttpRequest,
|
||||
server_state: web::Data<Arc<ServerState>>
|
||||
) -> Result<HttpResponse, LeaderboardErrorResponse> {
|
||||
|
||||
// TODO: There has to be a better way of doing this in parallel.
|
||||
// Some more intelligent DB connection pool. (What did jOOQ in Java do? Surely not this insanity!)
|
||||
let mysql_connection_1 = server_state.mysql_pool.acquire();
|
||||
let mysql_connection_2 = server_state.mysql_pool.acquire();
|
||||
|
||||
let mut mysql_connection_1 = mysql_connection_1
|
||||
.await
|
||||
.map_err(|e| {
|
||||
warn!("Could not acquire DB pool: {:?}", e);
|
||||
LeaderboardErrorResponse::server_error()
|
||||
})?;
|
||||
|
||||
let mut mysql_connection_2 = mysql_connection_2
|
||||
.await
|
||||
.map_err(|e| {
|
||||
warn!("Could not acquire DB pool: {:?}", e);
|
||||
LeaderboardErrorResponse::server_error()
|
||||
})?;
|
||||
|
||||
let maybe_tts_results =
|
||||
calculate_tts_model_leaderboard(&server_state.mysql_pool);
|
||||
calculate_tts_model_leaderboard(&mut mysql_connection_1);
|
||||
|
||||
let maybe_w2l_results =
|
||||
calculate_w2l_template_leaderboard(&server_state.mysql_pool);
|
||||
calculate_w2l_template_leaderboard(&mut mysql_connection_2);
|
||||
|
||||
let tts_results = match maybe_tts_results.await {
|
||||
Ok(results) => results,
|
||||
@@ -104,7 +117,7 @@ pub async fn leaderboard_handler(
|
||||
};
|
||||
|
||||
let body = serde_json::to_string(&response)
|
||||
.map_err(|e| LeaderboardErrorResponse::server_error())?;
|
||||
.map_err(|_e| LeaderboardErrorResponse::server_error())?;
|
||||
|
||||
Ok(HttpResponse::Ok()
|
||||
.content_type("application/json")
|
||||
|
||||
@@ -8,11 +8,11 @@ use actix_web::http::StatusCode;
|
||||
use actix_web::web::Path;
|
||||
use actix_web::{web, HttpResponse, HttpRequest};
|
||||
use chrono::{DateTime, Utc};
|
||||
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
|
||||
use crate::server_state::ServerState;
|
||||
use database_queries::column_types::record_visibility::RecordVisibility;
|
||||
use database_queries::column_types::vocoder_type::VocoderType;
|
||||
use database_queries::queries::tts::tts_models::get_tts_model::get_tts_model_by_token;
|
||||
use database_queries::queries::tts::tts_models::get_tts_model::get_tts_model_by_token_using_connection;
|
||||
use http_server_common::response::serialize_as_json_error::serialize_as_json_error;
|
||||
use log::warn;
|
||||
use std::fmt;
|
||||
use std::sync::Arc;
|
||||
@@ -116,7 +116,7 @@ pub struct TtsModelModeratorFieldInfo {
|
||||
|
||||
// =============== Error Response ===============
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, Serialize)]
|
||||
pub enum GetTtsModelError {
|
||||
ServerError,
|
||||
NotFound,
|
||||
@@ -125,18 +125,13 @@ pub enum GetTtsModelError {
|
||||
impl ResponseError for GetTtsModelError {
|
||||
fn status_code(&self) -> StatusCode {
|
||||
match *self {
|
||||
GetTtsModelError::ServerError=> StatusCode::INTERNAL_SERVER_ERROR,
|
||||
GetTtsModelError::ServerError => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
GetTtsModelError::NotFound => StatusCode::NOT_FOUND,
|
||||
}
|
||||
}
|
||||
|
||||
fn error_response(&self) -> HttpResponse {
|
||||
let error_reason = match self {
|
||||
GetTtsModelError::ServerError => "server error".to_string(),
|
||||
GetTtsModelError::NotFound => "not found".to_string(),
|
||||
};
|
||||
|
||||
to_simple_json_error(&error_reason, self.status_code())
|
||||
serialize_as_json_error(self)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -154,9 +149,16 @@ pub async fn get_tts_model_handler(
|
||||
path: Path<GetTtsModelPathInfo>,
|
||||
server_state: web::Data<Arc<ServerState>>) -> Result<HttpResponse, GetTtsModelError>
|
||||
{
|
||||
let mut mysql_connection = server_state.mysql_pool.acquire()
|
||||
.await
|
||||
.map_err(|e| {
|
||||
warn!("Could not acquire DB pool: {:?}", e);
|
||||
GetTtsModelError::ServerError
|
||||
})?;
|
||||
|
||||
let maybe_user_session = server_state
|
||||
.session_checker
|
||||
.maybe_get_user_session(&http_request, &server_state.mysql_pool)
|
||||
.maybe_get_user_session_from_connection(&http_request, &mut mysql_connection)
|
||||
.await
|
||||
.map_err(|e| {
|
||||
warn!("Session checker error: {:?}", e);
|
||||
@@ -176,10 +178,10 @@ pub async fn get_tts_model_handler(
|
||||
|| user_session.can_edit_other_users_tts_models;
|
||||
}
|
||||
|
||||
let model_query_result = get_tts_model_by_token(
|
||||
let model_query_result = get_tts_model_by_token_using_connection(
|
||||
&path.token,
|
||||
show_deleted_models,
|
||||
&server_state.mysql_pool
|
||||
&mut mysql_connection,
|
||||
).await;
|
||||
|
||||
let mut model = match model_query_result {
|
||||
|
||||
@@ -1,20 +1,15 @@
|
||||
use actix_http::Error;
|
||||
use actix_http::http::header;
|
||||
use actix_web::cookie::Cookie;
|
||||
use actix_web::HttpResponseBuilder;
|
||||
// NB: Incrementally getting rid of build warnings...
|
||||
#![forbid(unused_imports)]
|
||||
#![forbid(unused_mut)]
|
||||
#![forbid(unused_variables)]
|
||||
|
||||
use actix_web::error::ResponseError;
|
||||
use actix_web::http::StatusCode;
|
||||
use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage};
|
||||
use crate::AnyhowResult;
|
||||
use actix_web::{web, HttpResponse, HttpRequest};
|
||||
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
|
||||
use crate::server_state::ServerState;
|
||||
use derive_more::{Display, Error};
|
||||
use log::{info, warn, log};
|
||||
use regex::Regex;
|
||||
use sqlx::MySqlPool;
|
||||
use sqlx::error::DatabaseError;
|
||||
use sqlx::error::Error::Database;
|
||||
use sqlx::mysql::MySqlDatabaseError;
|
||||
use log::warn;
|
||||
use std::fmt;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[derive(Serialize, Copy, Clone)]
|
||||
@@ -79,7 +74,7 @@ pub struct SessionInfoSuccessResponse {
|
||||
pub user: Option<UserInfo>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Display)]
|
||||
#[derive(Debug)]
|
||||
pub enum SessionInfoError {
|
||||
ServerError,
|
||||
}
|
||||
@@ -100,13 +95,27 @@ impl ResponseError for SessionInfoError {
|
||||
}
|
||||
}
|
||||
|
||||
// NB: Not using derive_more::Display since Clion doesn't understand it.
|
||||
impl fmt::Display for SessionInfoError {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "{:?}", self)
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn session_info_handler(
|
||||
http_request: HttpRequest,
|
||||
server_state: web::Data<Arc<ServerState>>) -> Result<HttpResponse, SessionInfoError>
|
||||
{
|
||||
let mut mysql_connection = server_state.mysql_pool.acquire()
|
||||
.await
|
||||
.map_err(|e| {
|
||||
warn!("Could not acquire DB pool: {:?}", e);
|
||||
SessionInfoError::ServerError
|
||||
})?;
|
||||
|
||||
let maybe_user_session = server_state
|
||||
.session_checker
|
||||
.maybe_get_user_session(&http_request, &server_state.mysql_pool)
|
||||
.maybe_get_user_session_from_connection(&http_request, &mut mysql_connection)
|
||||
.await
|
||||
.map_err(|e| {
|
||||
warn!("Session checker error: {:?}", e);
|
||||
@@ -168,7 +177,7 @@ pub async fn session_info_handler(
|
||||
};
|
||||
|
||||
let body = serde_json::to_string(&response)
|
||||
.map_err(|e| SessionInfoError::ServerError)?;
|
||||
.map_err(|_e| SessionInfoError::ServerError)?;
|
||||
|
||||
Ok(HttpResponse::Ok()
|
||||
.content_type("application/json")
|
||||
|
||||
@@ -1,13 +1,18 @@
|
||||
// NB: Incrementally getting rid of build warnings...
|
||||
#![forbid(unused_imports)]
|
||||
#![forbid(unused_mut)]
|
||||
#![forbid(unused_variables)]
|
||||
|
||||
use actix_web::HttpRequest;
|
||||
use anyhow::anyhow;
|
||||
use crate::AnyhowResult;
|
||||
use crate::http_server::web_utils::cookie_manager::CookieManager;
|
||||
use database_queries::column_types::record_visibility::RecordVisibility;
|
||||
use database_queries::helpers::boolean_converters::{nullable_i8_to_optional_bool, i8_to_bool};
|
||||
use log::{info, warn};
|
||||
use sqlx::{MySqlPool, MySql};
|
||||
use log::warn;
|
||||
use sqlx::error::Error::RowNotFound;
|
||||
use sqlx::pool::PoolConnection;
|
||||
use sqlx::{MySqlPool, MySql};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct SessionChecker {
|
||||
@@ -165,18 +170,22 @@ AND deleted_at IS NULL
|
||||
}
|
||||
}
|
||||
|
||||
//#[deprecated = "Use the PoolConnection method"]
|
||||
#[deprecated = "Use the PoolConnection<MySql> method instead of the MySqlPool one."]
|
||||
pub async fn maybe_get_user_session(
|
||||
&self,
|
||||
request: &HttpRequest,
|
||||
pool: &MySqlPool) -> AnyhowResult<Option<SessionUserRecord>>
|
||||
pool: &MySqlPool,
|
||||
) -> AnyhowResult<Option<SessionUserRecord>>
|
||||
{
|
||||
let mut connection = pool.acquire().await?;
|
||||
self.maybe_get_user_session_from_connection(request, &mut connection).await
|
||||
}
|
||||
|
||||
pub async fn maybe_get_user_session_from_connection(&self, request: &HttpRequest, pool: &mut PoolConnection<MySql>)
|
||||
-> AnyhowResult<Option<SessionUserRecord>>
|
||||
pub async fn maybe_get_user_session_from_connection(
|
||||
&self,
|
||||
request: &HttpRequest,
|
||||
mysql_connection: &mut PoolConnection<MySql>,
|
||||
) -> AnyhowResult<Option<SessionUserRecord>>
|
||||
{
|
||||
|
||||
let session_token = match self.cookie_manager.decode_session_token_from_request(request)? {
|
||||
@@ -240,7 +249,7 @@ WHERE user_sessions.token = ?
|
||||
"#,
|
||||
session_token.to_string(),
|
||||
)
|
||||
.fetch_one(pool)
|
||||
.fetch_one(mysql_connection)
|
||||
.await; // TODO: This will return error if it doesn't exist
|
||||
|
||||
match maybe_user_record {
|
||||
|
||||
Reference in new issue
Block a user