Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 29 additions & 23 deletions src/controllers/user/resend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ use crate::auth::AuthCheck;
use crate::controllers::helpers::ok_true;
use crate::models::Email;
use crate::tasks::spawn_blocking;
use crate::util::errors::bad_request;
use crate::util::errors::AppResult;
use crate::util::errors::{bad_request, BoxedAppError};
use axum::extract::Path;
use axum::response::Response;
use crates_io_database::schema::emails;
use diesel::dsl::sql;
use diesel::prelude::*;
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
use diesel_async::scoped_futures::ScopedFutureExt;
use diesel_async::{AsyncConnection, RunQueryDsl};
use http::request::Parts;

/// Handles `PUT /user/:user_id/resend` route
Expand All @@ -22,35 +23,40 @@ pub async fn regenerate_token_and_send(
) -> AppResult<Response> {
let mut conn = state.db_write().await?;
let auth = AuthCheck::default().check(&req, &mut conn).await?;
spawn_blocking(move || {
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();

let user = auth.user();

// need to check if current user matches user to be updated
if user.id != param_user_id {
return Err(bad_request("current user does not match requested user"));
}
// need to check if current user matches user to be updated
if auth.user_id() != param_user_id {
return Err(bad_request("current user does not match requested user"));
}

conn.transaction(|conn| -> AppResult<_> {
let email: Email = diesel::update(Email::belonging_to(user))
conn.transaction(|conn| {
async move {
let email: Email = diesel::update(Email::belonging_to(auth.user()))
.set(emails::token.eq(sql("DEFAULT")))
.get_result(conn)
.await
.optional()?
.ok_or_else(|| bad_request("Email could not be found"))?;

let email1 = UserConfirmEmail {
user_name: &user.gh_login,
domain: &state.emails.domain,
token: email.token,
};

state.emails.send(&email.email, email1).map_err(Into::into)
})?;

ok_true()
spawn_blocking(move || {
let email1 = UserConfirmEmail {
user_name: &auth.user().gh_login,
domain: &state.emails.domain,
token: email.token,
};

state
.emails
.send(&email.email, email1)
.map_err(BoxedAppError::from)
})
.await
}
.scope_boxed()
})
.await
.await?;

ok_true()
}

#[cfg(test)]
Expand Down