Display aliases
This commit is contained in:
parent
5cd7f26717
commit
1785d25bc6
4 changed files with 138 additions and 3 deletions
42
src/main.rs
42
src/main.rs
|
|
@ -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());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue