use sqlx::{PgConnection, Row};
use uuid::Uuid;
pub struct AliasRow {
pub id: Uuid,
pub alias_name: String,
pub alias_domain_id: Option<Uuid>,
pub alias_contact: String,
pub alias_model_id: Option<Uuid>,
pub alias_parent_model_id: Option<Uuid>,
pub alias_parent_thread_id: Option<Uuid>,
pub alias_user_id: Option<Uuid>,
pub alias_defaults: Option<String>,
pub alias_force_thread_id: Option<Uuid>,
pub alias_reply_to_address: Option<String>,
}
pub struct AliasResolutionRepository;
impl AliasResolutionRepository {
pub fn new() -> Self {
Self
}
}
impl Default for AliasResolutionRepository {
fn default() -> Self {
Self::new()
}
}
impl AliasResolutionRepository {
pub async fn resolve(
conn: &mut PgConnection,
alias_name: &str,
alias_domain_id: Option<Uuid>,
) -> Result<Option<AliasRow>, sqlx::Error> {
let row = sqlx::query(
r#"SELECT id, alias_name, alias_domain_id, alias_contact::text AS alias_contact,
alias_model_id, alias_parent_model_id, alias_parent_thread_id,
alias_user_id, alias_defaults, alias_force_thread_id, alias_reply_to_address
FROM messaging.mail_aliases
WHERE alias_name = $1
AND alias_domain_id IS NOT DISTINCT FROM $2
AND (metadata->>'deleted_at') IS NULL
LIMIT 1"#,
)
.bind(alias_name)
.bind(alias_domain_id)
.fetch_optional(&mut *conn)
.await?;
Ok(row.map(|r| AliasRow {
id: r.get("id"),
alias_name: r.get("alias_name"),
alias_domain_id: r.get("alias_domain_id"),
alias_contact: r.get("alias_contact"),
alias_model_id: r.get("alias_model_id"),
alias_parent_model_id: r.get("alias_parent_model_id"),
alias_parent_thread_id: r.get("alias_parent_thread_id"),
alias_user_id: r.get("alias_user_id"),
alias_defaults: r.get("alias_defaults"),
alias_force_thread_id: r.get("alias_force_thread_id"),
alias_reply_to_address: r.get("alias_reply_to_address"),
}))
}
}