Skip to main content

max / makenotwork

2.0 KB · 71 lines History Blame Raw
1 //! Project embed handlers.
2
3 use axum::{
4 extract::{Path, State},
5 response::{Html, IntoResponse, Response},
6 };
7
8 use crate::quasi::embeds;
9 use crate::{
10 config::Config,
11 db::{self},
12 error::{AppError, Result},
13 };
14 use quasi_router::Document;
15 use sqlx::PgPool;
16
17 use super::item::set_embed_headers;
18
19 #[tracing::instrument(skip_all, name = "embed::project_card")]
20 /// GET /embed/p/{project_slug}/card
21 pub(super) async fn project_card(
22 State(db): State<PgPool>,
23 State(config): State<Config>,
24 Path(project_slug): Path<String>,
25 ) -> Result<Response> {
26 let project = db::projects::get_public_project_by_slug_str(&db, &project_slug)
27 .await?
28 .ok_or(AppError::NotFound)?;
29
30 let user = db::users::get_user_by_id(&db, project.user_id)
31 .await?
32 .ok_or(AppError::NotFound)?;
33
34 if user.is_suspended() || user.is_deactivated() {
35 return Err(AppError::NotFound);
36 }
37
38 let items = db::items::get_public_items_by_project(&db, project.id).await?;
39 let item_count = items.len();
40
41 let description_excerpt: String = project
42 .description
43 .as_deref()
44 .unwrap_or("")
45 .chars()
46 .take(150)
47 .collect();
48
49 let project_url = format!("{}/p/{}", config.host_url, project_slug);
50 let profile_url = format!("{}/u/{}", config.host_url, user.username);
51 let creator_name = user.display_name.as_deref().unwrap_or(&user.username);
52 let category_label = project.project_type.label();
53
54 let view = embeds::ProjectView {
55 title: project.title.clone(),
56 creator_display_name: creator_name.to_string(),
57 profile_url,
58 project_url,
59 cover_image_url: project.cover_image_url.clone(),
60 description_excerpt,
61 item_count,
62 category_label: category_label.to_string(),
63 };
64 let mut response = Html(embeds::document(
65 &embeds::project_card(&view).documented(Document::default().classed("embed-card")),
66 ))
67 .into_response();
68 set_embed_headers(&mut response);
69 Ok(response)
70 }
71