diff --git a/src/db/album.rs b/src/db/album.rs index 786fc0e..8a0f2b0 100644 --- a/src/db/album.rs +++ b/src/db/album.rs @@ -22,6 +22,8 @@ impl Database { cover_image_id: r.get("cover_image_id"), image_count: r.get("image_count"), created_at: r.get("created_at"), + tags: vec![], + persons: vec![], } }).collect()) } @@ -114,6 +116,8 @@ impl Database { cover_image_id: r.get("cover_image_id"), image_count: r.get("image_count"), created_at: r.get("created_at"), + tags: vec![], + persons: vec![], } }).collect()) } diff --git a/src/db/metadata.rs b/src/db/metadata.rs index b789d64..dd4c88a 100644 --- a/src/db/metadata.rs +++ b/src/db/metadata.rs @@ -45,6 +45,8 @@ impl Database { title: r.get("title"), document: r.get("document"), description: r.get("description"), cover_image_id: r.get("cover_image_id"), image_count: r.get("image_count"), created_at: r.get("created_at"), + tags: vec![], + persons: vec![], }).collect() } @@ -182,6 +184,7 @@ impl Database { title: r.get("title"), document: r.get("document"), description: r.get("description"), cover_image_id: r.get("cover_image_id"), image_count: r.get("image_count"), created_at: r.get("created_at"), + tags: vec![], persons: vec![], }; map.entry(tag).or_default().push(album); } @@ -216,6 +219,7 @@ impl Database { title: r.get("title"), document: r.get("document"), description: r.get("description"), cover_image_id: r.get("cover_image_id"), image_count: r.get("image_count"), created_at: r.get("created_at"), + tags: vec![], persons: vec![], }).collect() } diff --git a/src/models/album.rs b/src/models/album.rs index 4fa8ec5..24c697b 100644 --- a/src/models/album.rs +++ b/src/models/album.rs @@ -21,6 +21,8 @@ pub struct AlbumInfo { pub cover_image_id: Option, pub image_count: i64, pub created_at: String, + pub tags: Vec, + pub persons: Vec, } #[derive(Debug, Serialize, Deserialize)] diff --git a/src/search_db/search.rs b/src/search_db/search.rs index ede5687..97ff734 100644 --- a/src/search_db/search.rs +++ b/src/search_db/search.rs @@ -83,16 +83,40 @@ impl SearchDb { cover_image_id: r.get("cover_image_id"), image_count: r.get("image_count"), created_at: r.get("created_at"), + tags: vec![], + persons: vec![], } }).collect()) } - /// 获取全量相册列表(缓存烘焙用) + /// 获取全量相册列表(缓存烘焙用,含 tags 和 persons) pub async fn get_all_albums(&self) -> Result, sqlx::Error> { let rows = sqlx::query( "SELECT id, title, cover_image_id, image_count, created_at FROM albums ORDER BY created_at DESC" ).fetch_all(&self.pool).await?; + // 批量获取所有 album-tag 关系 + let tag_rows = sqlx::query( + r#"SELECT at.album_id, t.name FROM album_tags at JOIN tags t ON at.tag_id = t.id"# + ).fetch_all(&self.pool).await?; + let mut album_tags: std::collections::HashMap> = std::collections::HashMap::new(); + for r in &tag_rows { + let aid: String = r.get("album_id"); + let name: String = r.get("name"); + album_tags.entry(aid).or_default().push(name); + } + + // 批量获取所有 album-person 关系 + let person_rows = sqlx::query( + r#"SELECT ap.album_id, p.name FROM album_persons ap JOIN persons p ON ap.person_id = p.id"# + ).fetch_all(&self.pool).await?; + let mut album_persons: std::collections::HashMap> = std::collections::HashMap::new(); + for r in &person_rows { + let aid: String = r.get("album_id"); + let name: String = r.get("name"); + album_persons.entry(aid).or_default().push(name); + } + Ok(rows.iter().map(|r| { let id_str: String = r.get("id"); AlbumInfo { @@ -103,6 +127,8 @@ impl SearchDb { cover_image_id: r.get("cover_image_id"), image_count: r.get("image_count"), created_at: r.get("created_at"), + tags: album_tags.remove(&id_str).unwrap_or_default(), + persons: album_persons.remove(&id_str).unwrap_or_default(), } }).collect()) } @@ -152,6 +178,8 @@ impl SearchDb { cover_image_id: r.get("cover_image_id"), image_count: r.get("image_count"), created_at: r.get("created_at"), + tags: vec![], + persons: vec![], }; map.entry(tag_name).or_default().push(album); } @@ -179,6 +207,8 @@ impl SearchDb { cover_image_id: r.get("cover_image_id"), image_count: r.get("image_count"), created_at: r.get("created_at"), + tags: vec![], + persons: vec![], } }).collect() } @@ -294,6 +324,8 @@ impl SearchDb { cover_image_id: r.get("cover_image_id"), image_count: r.get("image_count"), created_at: r.get("created_at"), + tags: vec![], + persons: vec![], } }).collect() }