75 lines
3.2 KiB
Rust
75 lines
3.2 KiB
Rust
use super::Database;
|
|
use crate::models::*;
|
|
use sqlx::Row;
|
|
use uuid::Uuid;
|
|
|
|
/// 重新导出用于 cross-module access
|
|
pub use crate::models::image::Image;
|
|
|
|
impl Database {
|
|
pub async fn add_images(&self, images: Vec<CreateImage>) -> Result<Vec<Uuid>, sqlx::Error> {
|
|
let _guard = self.write_lock.lock().await;
|
|
if images.is_empty() { return Ok(Vec::new()); }
|
|
let now = chrono::Utc::now().to_rfc3339();
|
|
let mut ids = Vec::new();
|
|
let first_album_id = images.first().map(|img| img.album_id);
|
|
|
|
for img in &images {
|
|
let id = Uuid::new_v4();
|
|
sqlx::query(
|
|
"INSERT INTO images (id, album_id, filename, original_url, title, description, file_size, width, height, mime_type, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
|
).bind(id.to_string()).bind(img.album_id.to_string()).bind(&img.filename)
|
|
.bind(&img.original_url).bind(&img.title).bind(&img.description)
|
|
.bind(img.file_size).bind(img.width).bind(img.height).bind(&img.mime_type).bind(&now)
|
|
.execute(&self.pool).await?;
|
|
ids.push(id);
|
|
}
|
|
|
|
if let Some(aid) = first_album_id {
|
|
self.update_album_image_count(aid).await?;
|
|
let count = sqlx::query_scalar::<_, i64>("SELECT COUNT(*) FROM images WHERE album_id = ?")
|
|
.bind(aid.to_string()).fetch_one(&self.pool).await?;
|
|
if count == images.len() as i64 {
|
|
self.update_album_cover(aid, ids[0]).await?;
|
|
}
|
|
}
|
|
Ok(ids)
|
|
}
|
|
|
|
pub async fn get_image(&self, image_id: Uuid) -> Result<Option<Image>, sqlx::Error> {
|
|
let row = sqlx::query("SELECT * FROM images WHERE id = ?")
|
|
.bind(image_id.to_string()).fetch_optional(&self.pool).await?;
|
|
let Some(r) = row else { return Ok(None) };
|
|
Ok(Some(Image {
|
|
id: image_id,
|
|
album_id: Uuid::parse_str(&r.get::<String, _>("album_id")).unwrap_or_else(|_| Uuid::nil()),
|
|
filename: r.get("filename"),
|
|
original_url: r.get("original_url"),
|
|
title: r.get("title"),
|
|
description: r.get("description"),
|
|
file_size: r.get("file_size"),
|
|
width: r.get("width"),
|
|
height: r.get("height"),
|
|
mime_type: r.get("mime_type"),
|
|
created_at: r.get("created_at"),
|
|
}))
|
|
}
|
|
|
|
pub async fn get_unprocessed_images(&self, limit: i64) -> Result<Vec<Image>, sqlx::Error> {
|
|
let rows = sqlx::query("SELECT * FROM images WHERE file_size > 0 LIMIT ?")
|
|
.bind(limit).fetch_all(&self.pool).await?;
|
|
Ok(rows.iter().map(|r| Image {
|
|
id: Uuid::parse_str(&r.get::<String, _>("id")).unwrap_or_else(|_| Uuid::nil()),
|
|
album_id: Uuid::parse_str(&r.get::<String, _>("album_id")).unwrap_or_else(|_| Uuid::nil()),
|
|
filename: r.get("filename"),
|
|
original_url: r.get("original_url"),
|
|
title: r.get("title"),
|
|
description: r.get("description"),
|
|
file_size: r.get("file_size"),
|
|
width: r.get("width"),
|
|
height: r.get("height"),
|
|
mime_type: r.get("mime_type"),
|
|
created_at: r.get("created_at"),
|
|
}).collect())
|
|
}
|
|
} |