diff --git a/src/main.rs b/src/main.rs index b7c6905..ddf9784 100644 --- a/src/main.rs +++ b/src/main.rs @@ -602,6 +602,38 @@ async fn delete_mail( Ok(Redirect::to("/")) } +#[tracing::instrument(skip(state))] +async fn delete_alias( + state: State>, + User(user): User, + Form(delete): Form, +) -> Result { + let mut tx = state.db.begin().await?; + + sqlx::query!("DELETE FROM alias_recipient WHERE mail = $1", delete.mail) + .execute(&mut *tx) + .await?; + + let rows_affected = sqlx::query!( + "DELETE FROM emails WHERE id = $1 AND mail = $2", + user, + delete.mail + ) + .execute(&mut *tx) + .await? + .rows_affected(); + + if rows_affected != 1 { + tracing::warn!("Invalid number of rows affected in delete: {rows_affected}"); + tx.rollback().await?; + return Err(Error::InternalError); + } + + tx.commit().await?; + + Ok(Redirect::to("/")) +} + #[derive(Serialize, Deserialize, Debug)] enum UserError { MailAlreadyExists, @@ -725,6 +757,7 @@ async fn main() -> color_eyre::Result<()> { .route("/mail/delete", post(delete_mail)) .route("/mail/add", post(add_mail)) .route("/alias/recipient/add", post(add_recipient)) + .route("/alias/delete", post(delete_alias)) .fallback(page_not_found) .with_state(Arc::new(AppState { db,