Skip to main content

max / makenotwork

1.2 KB · 44 lines History Blame Raw
1 //! User embed handlers: tip button.
2
3 use axum::{
4 extract::{Path, State},
5 response::{IntoResponse, Response},
6 };
7
8 use crate::{
9 db::{self, Username},
10 error::{AppError, Result},
11 AppState,
12 };
13
14 use super::item::set_embed_headers;
15
16 #[tracing::instrument(skip_all, name = "embed::tip_button")]
17 /// GET /embed/u/{username}/tip
18 pub(super) async fn tip_button(
19 State(state): State<AppState>,
20 Path(username): Path<String>,
21 ) -> Result<Response> {
22 let username = Username::new(&username).map_err(|_| AppError::NotFound)?;
23 let user = db::users::get_user_by_username(&state.db, &username)
24 .await?
25 .ok_or(AppError::NotFound)?;
26
27 if user.is_suspended() || user.is_deactivated() || !user.tips_enabled {
28 return Err(AppError::NotFound);
29 }
30
31 let display_name = user.display_name.as_deref().unwrap_or(&user.username).to_string();
32 let tip_url = format!("{}/u/{}/tip", state.config.host_url, user.username);
33
34 let mut response = crate::templates::EmbedTipButtonTemplate {
35 display_name,
36 username: user.username.to_string(),
37 tip_url,
38 avatar_url: user.avatar_url.clone(),
39 }
40 .into_response();
41 set_embed_headers(&mut response);
42 Ok(response)
43 }
44