Allow to delete recipients
This commit is contained in:
parent
0bba360281
commit
388db93e3c
2 changed files with 57 additions and 13 deletions
59
src/main.rs
59
src/main.rs
|
|
@ -502,8 +502,9 @@ struct HomeQuery {
|
||||||
user_error: Option<UserError>,
|
user_error: Option<UserError>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AliasPart {
|
#[derive(Deserialize, Debug)]
|
||||||
mail: String,
|
struct AliasRecipient {
|
||||||
|
alias: String,
|
||||||
recipient: String,
|
recipient: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -545,9 +546,9 @@ async fn home(
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let mut alias_stream = sqlx::query_as!(
|
let mut alias_stream = sqlx::query_as!(
|
||||||
AliasPart,
|
AliasRecipient,
|
||||||
r#"
|
r#"
|
||||||
SELECT alias_recipient.mail,recipient
|
SELECT alias_recipient.mail as alias,recipient
|
||||||
FROM emails,alias_recipient
|
FROM emails,alias_recipient
|
||||||
WHERE id = $1 AND alias = true AND emails.mail = alias_recipient.mail
|
WHERE id = $1 AND alias = true AND emails.mail = alias_recipient.mail
|
||||||
"#,
|
"#,
|
||||||
|
|
@ -557,7 +558,7 @@ async fn home(
|
||||||
|
|
||||||
let mut aliases: HashMap<_, _> = aliases.into_iter().map(|a| (a.mail, Vec::new())).collect();
|
let mut aliases: HashMap<_, _> = aliases.into_iter().map(|a| (a.mail, Vec::new())).collect();
|
||||||
while let Some(alias) = alias_stream.try_next().await? {
|
while let Some(alias) = alias_stream.try_next().await? {
|
||||||
aliases.get_mut(&alias.mail).unwrap().push(alias.recipient);
|
aliases.get_mut(&alias.alias).unwrap().push(alias.recipient);
|
||||||
}
|
}
|
||||||
|
|
||||||
let aliases: Vec<_> = aliases
|
let aliases: Vec<_> = aliases
|
||||||
|
|
@ -685,17 +686,11 @@ async fn add_mail(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
|
||||||
struct AddRecipient {
|
|
||||||
alias: String,
|
|
||||||
recipient: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tracing::instrument(skip(state))]
|
#[tracing::instrument(skip(state))]
|
||||||
async fn add_recipient(
|
async fn add_recipient(
|
||||||
state: State<Arc<AppState>>,
|
state: State<Arc<AppState>>,
|
||||||
User(user): User,
|
User(user): User,
|
||||||
Form(add): Form<AddRecipient>,
|
Form(add): Form<AliasRecipient>,
|
||||||
) -> Result<Redirect, Error> {
|
) -> Result<Redirect, Error> {
|
||||||
let can_use_alias = sqlx::query!(
|
let can_use_alias = sqlx::query!(
|
||||||
"SELECT COUNT(*) FROM emails WHERE id = $1 AND mail = $2",
|
"SELECT COUNT(*) FROM emails WHERE id = $1 AND mail = $2",
|
||||||
|
|
@ -724,6 +719,45 @@ async fn add_recipient(
|
||||||
Ok(Redirect::to("/"))
|
Ok(Redirect::to("/"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument(skip(state))]
|
||||||
|
async fn delete_recipient(
|
||||||
|
state: State<Arc<AppState>>,
|
||||||
|
User(user): User,
|
||||||
|
Form(delete): Form<AliasRecipient>,
|
||||||
|
) -> Result<Redirect, Error> {
|
||||||
|
let can_use_alias = sqlx::query!(
|
||||||
|
"SELECT COUNT(*) FROM emails WHERE id = $1 AND mail = $2",
|
||||||
|
user,
|
||||||
|
delete.alias
|
||||||
|
)
|
||||||
|
.fetch_one(&state.db)
|
||||||
|
.await?
|
||||||
|
.count
|
||||||
|
.expect("count should not be null")
|
||||||
|
> 0;
|
||||||
|
|
||||||
|
if !can_use_alias {
|
||||||
|
tracing::error!("User is not authorized to use this alias");
|
||||||
|
return Err(Error::InternalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
let rows_affected = sqlx::query!(
|
||||||
|
"DELETE FROM alias_recipient WHERE mail = $1 AND recipient = $2",
|
||||||
|
delete.alias,
|
||||||
|
delete.recipient,
|
||||||
|
)
|
||||||
|
.execute(&state.db)
|
||||||
|
.await?
|
||||||
|
.rows_affected();
|
||||||
|
|
||||||
|
if rows_affected != 1 {
|
||||||
|
tracing::warn!("Invalid number of rows affected in delete: {rows_affected}");
|
||||||
|
return Err(Error::InternalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Redirect::to("/"))
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> color_eyre::Result<()> {
|
async fn main() -> color_eyre::Result<()> {
|
||||||
color_eyre::install()?;
|
color_eyre::install()?;
|
||||||
|
|
@ -757,6 +791,7 @@ async fn main() -> color_eyre::Result<()> {
|
||||||
.route("/mail/delete", post(delete_mail))
|
.route("/mail/delete", post(delete_mail))
|
||||||
.route("/mail/add", post(add_mail))
|
.route("/mail/add", post(add_mail))
|
||||||
.route("/alias/recipient/add", post(add_recipient))
|
.route("/alias/recipient/add", post(add_recipient))
|
||||||
|
.route("/alias/recipient/delete", post(delete_recipient))
|
||||||
.route("/alias/delete", post(delete_alias))
|
.route("/alias/delete", post(delete_alias))
|
||||||
.fallback(page_not_found)
|
.fallback(page_not_found)
|
||||||
.with_state(Arc::new(AppState {
|
.with_state(Arc::new(AppState {
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,16 @@
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group mt-1">
|
<ul class="list-group mt-1">
|
||||||
{% set alias_idx = loop.index %}
|
{% set alias_idx = loop.index %}
|
||||||
{% for recpt in alias.recipients %}<li class="list-group-item">{{ recpt }}</li>{% endfor %}
|
{% for recpt in alias.recipients %}
|
||||||
|
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||||
|
{{ recpt }}
|
||||||
|
{{ self::delete_modal(modal_id="aliasRctDelete" ~ alias_idx ~ loop.index,
|
||||||
|
confirm_text="Delete recipient '" ~ recpt ~ "' for '" ~ alias.mail ~ "'",
|
||||||
|
action="/alias/recipient/delete",
|
||||||
|
payload=["alias", alias.mail, "recipient", recpt])
|
||||||
|
}}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
{{ self::add_modal(modal_id="addRecipient",
|
{{ self::add_modal(modal_id="addRecipient",
|
||||||
add_button="Add Recipient",
|
add_button="Add Recipient",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue