From 03eee526a0795e7a8a765c82ae1e1d61ee1b8102 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 17 May 2021 02:28:25 -0400 Subject: [PATCH] signup wip; db writes --- migrations/2021-05-15-071534_users/up.sql | 2 +- src/endpoints/users/create_account.rs | 13 +++-- src/main.rs | 70 +++++++++++------------ 3 files changed, 45 insertions(+), 40 deletions(-) diff --git a/migrations/2021-05-15-071534_users/up.sql b/migrations/2021-05-15-071534_users/up.sql index bd9c6d9a07..e2642b2e44 100644 --- a/migrations/2021-05-15-071534_users/up.sql +++ b/migrations/2021-05-15-071534_users/up.sql @@ -56,7 +56,7 @@ CREATE TABLE users ( ) NOT NULL DEFAULT 'light-mode', -- An uploaded avatar. Public hash in our bucket. - avatar_public_bucket_hash CHAR(32) NOT NULL, + avatar_public_bucket_hash CHAR(32) DEFAULT NULL, -- If the user doesn't want to use gravatar and doesn't have an uploaded avatar. disable_gravatar BOOLEAN NOT NULL DEFAULT false, diff --git a/src/endpoints/users/create_account.rs b/src/endpoints/users/create_account.rs index d85f853bb7..d76d7e648a 100644 --- a/src/endpoints/users/create_account.rs +++ b/src/endpoints/users/create_account.rs @@ -5,9 +5,11 @@ use actix_web::error::ResponseError; use actix_web::http::StatusCode; use actix_web::{Responder, web, HttpResponse, error}; use crate::endpoints::users::create_account::CreateAccountError::BadInput; +use crate::server_state::ServerState; +use crate::util::random::random_token; use derive_more::{Display, Error}; use log::{info, warn, log}; -use crate::server_state::ServerState; +use std::sync::Arc; const NEW_USER_ROLE: &'static str = "new-user"; @@ -68,7 +70,7 @@ impl ResponseError for CreateAccountError { pub async fn create_account_handler( request: web::Json, - server_state: web::Data) -> Result + server_state: web::Data>) -> Result { if request.username.len() < 3 { return Err(CreateAccountError::BadInput("username is too short".to_string())); @@ -86,7 +88,7 @@ pub async fn create_account_handler( return Err(CreateAccountError::BadInput("invalid email address".to_string())); } - let token = "token"; + let token = random_token(32); let password_hash = "temp"; let profile_markdown = ""; let profile_rendered_html = ""; @@ -123,7 +125,10 @@ VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) ) .execute(&server_state.mysql_pool) .await - .map_err(|_| CreateAccountError::ServerError)? + .map_err(|e| { + warn!("Query error: {:?}", e); + return CreateAccountError::ServerError; + })? .last_insert_id(); info!("new user id: {}", record_id); diff --git a/src/main.rs b/src/main.rs index a8e0862418..1dad1560d2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -71,7 +71,8 @@ pub async fn serve(server_state: ServerState) -> AnyhowResult<()> let log_format = "[%{HOSTNAME}e] %a \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\" %T"; HttpServer::new(move || { - let mut app = App::new() + App::new() + .app_data(server_state_arc.clone()) .wrap(Cors::default() .allowed_origin("http://api.vo.codes") .allowed_origin("http://jungle.horse") @@ -132,42 +133,41 @@ pub async fn serve(server_state: ServerState) -> AnyhowResult<()> .route(web::get().to(|| HttpResponse::Ok())) .route(web::head().to(|| HttpResponse::Ok())) ) - ); - // Admin UI & old frontend - //.service(Files::new("/frontend", admin_asset_directory.clone()) - // .index_file("FAKE_INDEX.HTML")) - //.service(Files::new("/adminui", admin_asset_directory.clone()) - // .index_file("index.html")) - // Early access static path for assets - //.service(Files::new("/static", static_asset_directory.clone()) - // .index_file("FAKE_INDEX.HTML")) - /*.service( - web::resource("/login") - .route(web::post().to(login_handler)) - .route(web::head().to(|| HttpResponse::Ok())) ) - .service( - web::resource("/logout") - .route(web::post().to(logout_handler)) - .route(web::head().to(|| HttpResponse::Ok())) - ) - .service(get_liveness) - .service(get_models) - .service(get_readiness) - .service(get_root) - .service(get_sentences) - .service(get_service_settings) - .service(get_speakers) - .service(get_early_access_speakers) - .service(get_dynamic_early_access_speakers) - .service(get_words);*/ - - app.app_data(server_state_arc.clone()) }) - .bind(bind_address)? - .workers(num_workers) - .run() - .await?; + .bind(bind_address)? + .workers(num_workers) + .run() + .await?; + + // Admin UI & old frontend + //.service(Files::new("/frontend", admin_asset_directory.clone()) + // .index_file("FAKE_INDEX.HTML")) + //.service(Files::new("/adminui", admin_asset_directory.clone()) + // .index_file("index.html")) + // Early access static path for assets + //.service(Files::new("/static", static_asset_directory.clone()) + // .index_file("FAKE_INDEX.HTML")) + /*.service( + web::resource("/login") + .route(web::post().to(login_handler)) + .route(web::head().to(|| HttpResponse::Ok())) + ) + .service( + web::resource("/logout") + .route(web::post().to(logout_handler)) + .route(web::head().to(|| HttpResponse::Ok())) + ) + .service(get_liveness) + .service(get_models) + .service(get_readiness) + .service(get_root) + .service(get_sentences) + .service(get_service_settings) + .service(get_speakers) + .service(get_early_access_speakers) + .service(get_dynamic_early_access_speakers) + .service(get_words);*/ Ok(()) }