Skip to content

Commit 525e9bb

Browse files
committed
controllers/user/update: Move regenerate_token_and_send() to a dedicated module
1 parent 18b2883 commit 525e9bb

File tree

4 files changed

+58
-44
lines changed

4 files changed

+58
-44
lines changed

src/controllers/user.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
pub mod me;
22
pub mod other;
3+
mod resend;
34
pub mod session;
45
pub mod update;
56

7+
pub use resend::regenerate_token_and_send;
68
pub use update::update_user;

src/controllers/user/resend.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
use super::update::UserConfirmEmail;
2+
use crate::app::AppState;
3+
use crate::auth::AuthCheck;
4+
use crate::controllers::helpers::ok_true;
5+
use crate::models::Email;
6+
use crate::tasks::spawn_blocking;
7+
use crate::util::errors::bad_request;
8+
use crate::util::errors::AppResult;
9+
use axum::extract::Path;
10+
use axum::response::Response;
11+
use crates_io_database::schema::emails;
12+
use diesel::dsl::sql;
13+
use diesel::prelude::*;
14+
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
15+
use http::request::Parts;
16+
17+
/// Handles `PUT /user/:user_id/resend` route
18+
pub async fn regenerate_token_and_send(
19+
state: AppState,
20+
Path(param_user_id): Path<i32>,
21+
req: Parts,
22+
) -> AppResult<Response> {
23+
let mut conn = state.db_write().await?;
24+
let auth = AuthCheck::default().check(&req, &mut conn).await?;
25+
spawn_blocking(move || {
26+
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
27+
28+
let user = auth.user();
29+
30+
// need to check if current user matches user to be updated
31+
if user.id != param_user_id {
32+
return Err(bad_request("current user does not match requested user"));
33+
}
34+
35+
conn.transaction(|conn| -> AppResult<_> {
36+
let email: Email = diesel::update(Email::belonging_to(user))
37+
.set(emails::token.eq(sql("DEFAULT")))
38+
.get_result(conn)
39+
.optional()?
40+
.ok_or_else(|| bad_request("Email could not be found"))?;
41+
42+
let email1 = UserConfirmEmail {
43+
user_name: &user.gh_login,
44+
domain: &state.emails.domain,
45+
token: email.token,
46+
};
47+
48+
state.emails.send(&email.email, email1).map_err(Into::into)
49+
})?;
50+
51+
ok_true()
52+
})
53+
.await
54+
}

src/controllers/user/update.rs

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
use crate::app::AppState;
22
use crate::auth::AuthCheck;
33
use crate::controllers::helpers::ok_true;
4-
use crate::models::{Email, NewEmail};
4+
use crate::models::NewEmail;
55
use crate::schema::{emails, users};
66
use crate::tasks::spawn_blocking;
77
use crate::util::diesel::prelude::*;
88
use crate::util::errors::{bad_request, server_error, AppResult};
99
use axum::extract::Path;
1010
use axum::response::Response;
1111
use axum::Json;
12-
use diesel::dsl::sql;
1312
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
1413
use http::request::Parts;
1514
use lettre::Address;
@@ -114,47 +113,6 @@ pub async fn update_user(
114113
.await
115114
}
116115

117-
/// Handles `PUT /user/:user_id/resend` route
118-
pub async fn regenerate_token_and_send(
119-
state: AppState,
120-
Path(param_user_id): Path<i32>,
121-
req: Parts,
122-
) -> AppResult<Response> {
123-
let mut conn = state.db_write().await?;
124-
let auth = AuthCheck::default().check(&req, &mut conn).await?;
125-
spawn_blocking(move || {
126-
use diesel::RunQueryDsl;
127-
128-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
129-
130-
let user = auth.user();
131-
132-
// need to check if current user matches user to be updated
133-
if user.id != param_user_id {
134-
return Err(bad_request("current user does not match requested user"));
135-
}
136-
137-
conn.transaction(|conn| -> AppResult<_> {
138-
let email: Email = diesel::update(Email::belonging_to(user))
139-
.set(emails::token.eq(sql("DEFAULT")))
140-
.get_result(conn)
141-
.optional()?
142-
.ok_or_else(|| bad_request("Email could not be found"))?;
143-
144-
let email1 = UserConfirmEmail {
145-
user_name: &user.gh_login,
146-
domain: &state.emails.domain,
147-
token: email.token,
148-
};
149-
150-
state.emails.send(&email.email, email1).map_err(Into::into)
151-
})?;
152-
153-
ok_true()
154-
})
155-
.await
156-
}
157-
158116
pub struct UserConfirmEmail<'a> {
159117
pub user_name: &'a str,
160118
pub domain: &'a str,

src/router.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ pub fn build_axum_router(state: AppState) -> Router<()> {
133133
)
134134
.route(
135135
"/api/v1/users/:user_id/resend",
136-
put(user::update::regenerate_token_and_send),
136+
put(user::regenerate_token_and_send),
137137
)
138138
.route(
139139
"/api/v1/site_metadata",

0 commit comments

Comments
 (0)