//! User embed handlers: tip button. use axum::{ extract::{Path, State}, response::{IntoResponse, Response}, }; use crate::{ db::{self, Username}, error::{AppError, Result}, AppState, }; use super::item::set_embed_headers; #[tracing::instrument(skip_all, name = "embed::tip_button")] /// GET /embed/u/{username}/tip pub(super) async fn tip_button( State(state): State, Path(username): Path, ) -> Result { let username = Username::new(&username).map_err(|_| AppError::NotFound)?; let user = db::users::get_user_by_username(&state.db, &username) .await? .ok_or(AppError::NotFound)?; if user.is_suspended() || user.is_deactivated() || !user.tips_enabled { return Err(AppError::NotFound); } let display_name = user.display_name.as_deref().unwrap_or(&user.username).to_string(); let tip_url = format!("{}/u/{}/tip", state.config.host_url, user.username); let mut response = crate::templates::EmbedTipButtonTemplate { display_name, username: user.username.to_string(), tip_url, avatar_url: user.avatar_url.clone(), } .into_response(); set_embed_headers(&mut response); Ok(response) }