11//! The set of email verification requests for new users.
22
3- use axum:: { extract :: State , http:: StatusCode } ;
3+ use axum:: http:: StatusCode ;
44use axum_macros:: debug_handler;
55use lettre:: message:: Mailbox ;
66use serde:: { Deserialize , Serialize } ;
@@ -16,7 +16,7 @@ use crate::{
1616 db:: { self , TxResult } ,
1717 email:: { EmailTakenMessage , MessageTemplate , SendMessage , VerificationMessage } ,
1818 id:: Token ,
19- AppState , WEBSITE_ORIGIN ,
19+ WEBSITE_ORIGIN ,
2020} ;
2121
2222pub ( crate ) mod code;
@@ -47,25 +47,21 @@ pub(crate) enum GetQuery {
4747///
4848/// See [`crate::api::Error`].
4949#[ debug_handler]
50- pub ( crate ) async fn get (
51- State ( state) : State < AppState > ,
52- Query ( query) : Query < GetQuery > ,
53- ) -> Response < GetResponse > {
50+ pub ( crate ) async fn get ( Query ( query) : Query < GetQuery > ) -> Response < GetResponse > {
5451 let email = match query {
5552 GetQuery :: Token { token } => {
5653 let token_hash = hash_without_salt ( & token) ;
5754
58- let Some ( unverified_email) =
59- db:: transaction!( & state. db_pool, async |tx| -> TxResult <_, api:: Error > {
60- Ok ( sqlx:: query!(
61- "SELECT email FROM unverified_emails
62- WHERE token_hash = $1 AND user_id IS NULL" ,
63- token_hash. as_ref( ) ,
64- )
65- . fetch_optional( tx. as_mut( ) )
66- . await ?)
67- } )
68- . await ?
55+ let Some ( unverified_email) = db:: transaction!( async |tx| -> TxResult <_, api:: Error > {
56+ Ok ( sqlx:: query!(
57+ "SELECT email FROM unverified_emails
58+ WHERE token_hash = $1 AND user_id IS NULL" ,
59+ token_hash. as_ref( ) ,
60+ )
61+ . fetch_optional( tx. as_mut( ) )
62+ . await ?)
63+ } )
64+ . await ?
6965 else {
7066 return Err ( api:: Error :: ResourceNotFound ) ;
7167 } ;
@@ -74,19 +70,17 @@ pub(crate) async fn get(
7470 }
7571
7672 GetQuery :: EmailAndCode { email, code } => {
77- let Some ( unverified_email) =
78- db:: transaction!( & state. db_pool, async |tx| -> TxResult <_, api:: Error > {
79- Ok ( sqlx:: query!(
80- r#"SELECT email, code_hash as "code_hash!" FROM unverified_emails
81- WHERE user_id IS NULL AND email = $1 AND code_hash IS NOT NULL"# ,
82- email. as_str( ) ,
83- )
84- . fetch_optional( tx. as_mut( ) )
85- . await ?)
86- } )
87- . await ?
88- . filter ( |unverified_email| verify_hash ( & code, & unverified_email. code_hash ) )
89- else {
73+ let Some ( unverified_email) = db:: transaction!( async |tx| -> TxResult <_, api:: Error > {
74+ Ok ( sqlx:: query!(
75+ r#"SELECT email, code_hash as "code_hash!" FROM unverified_emails
76+ WHERE user_id IS NULL AND email = $1 AND code_hash IS NOT NULL"# ,
77+ email. as_str( ) ,
78+ )
79+ . fetch_optional( tx. as_mut( ) )
80+ . await ?)
81+ } )
82+ . await ?
83+ . filter ( |unverified_email| verify_hash ( & code, & unverified_email. code_hash ) ) else {
9084 return Err ( api:: Error :: ResourceNotFound ) ;
9185 } ;
9286
@@ -128,16 +122,13 @@ pub(crate) struct PostRequest {
128122///
129123/// See [`crate::api::Error`].
130124#[ debug_handler]
131- pub ( crate ) async fn post (
132- State ( state) : State < AppState > ,
133- Json ( body) : Json < PostRequest > ,
134- ) -> Response < PostResponse > {
125+ pub ( crate ) async fn post ( Json ( body) : Json < PostRequest > ) -> Response < PostResponse > {
135126 // We don't want bots creating accounts or spamming people with verification emails.
136127 if !captcha:: verify ( & body. captcha_token ) . await ? {
137128 return Err ( api:: Error :: CaptchaFailed ) ;
138129 }
139130
140- db:: transaction!( & state . db_pool , async |tx| -> TxResult <_, api:: Error > {
131+ db:: transaction!( async |tx| -> TxResult <_, api:: Error > {
141132 let existing_user = sqlx:: query!(
142133 "SELECT name FROM users
143134 WHERE email = $1" ,
0 commit comments