Display aliases

This commit is contained in:
traxys 2023-08-29 21:29:48 +02:00
parent 5cd7f26717
commit 1785d25bc6
4 changed files with 138 additions and 3 deletions

View file

@ -17,6 +17,7 @@ use axum_extra::extract::{cookie::Cookie, CookieJar};
use base64::{engine::general_purpose, engine::Engine};
use color_eyre::eyre;
use cookie::{time::OffsetDateTime, SameSite};
use futures_util::TryStreamExt;
use jwt_simple::prelude::*;
use once_cell::sync::Lazy;
use openidconnect::{
@ -500,6 +501,17 @@ struct HomeQuery {
user_error: Option<UserError>,
}
struct AliasPart {
mail: String,
recipient: String,
}
#[derive(Serialize)]
struct Alias {
mail: String,
recipients: Vec<String>,
}
async fn home(
state: State<Arc<AppState>>,
User(user): User,
@ -513,9 +525,39 @@ async fn home(
.fetch_all(&state.db)
.await?;
let aliases = sqlx::query_as!(
Mail,
"SELECT mail FROM emails WHERE id = $1 AND alias = true",
user
)
.fetch_all(&state.db)
.await?;
let mut alias_stream = sqlx::query_as!(
AliasPart,
r#"
SELECT alias_recipient.mail,recipient
FROM emails,alias_recipient
WHERE id = $1 AND alias = true AND emails.mail = alias_recipient.mail
"#,
user
)
.fetch(&state.db);
let mut aliases: HashMap<_, _> = aliases.into_iter().map(|a| (a.mail, Vec::new())).collect();
while let Some(alias) = alias_stream.try_next().await? {
aliases.get_mut(&alias.mail).unwrap().push(alias.recipient);
}
let aliases: Vec<_> = aliases
.into_iter()
.map(|(mail, recipients)| Alias { mail, recipients })
.collect();
let mut context = tera::Context::new();
context.insert("mails", &mails);
context.insert("mail_domain", &state.mail_domain);
context.insert("aliases", &aliases);
if let Some(err) = query.user_error {
tracing::info!("User error: {err:?}");
context.insert("user_error", &err.to_string());