diff --git a/apps/desktop/src-tauri/src/data/repositories/material_repository.rs b/apps/desktop/src-tauri/src/data/repositories/material_repository.rs index ca66b9b..530d5f2 100644 --- a/apps/desktop/src-tauri/src/data/repositories/material_repository.rs +++ b/apps/desktop/src-tauri/src/data/repositories/material_repository.rs @@ -452,10 +452,44 @@ impl MaterialRepository { } /// 根据项目ID获取项目信息 - pub async fn get_project_by_id(&self, _project_id: &str) -> Result> { - // 这里需要引用项目仓库,暂时返回None - // 在实际实现中,应该通过依赖注入获取项目仓库 - Ok(None) + pub async fn get_project_by_id(&self, project_id: &str) -> Result> { + use crate::data::models::project::Project; + use chrono::{DateTime, Utc}; + + let conn = self.connection.lock().unwrap(); + + let mut stmt = conn.prepare( + "SELECT id, name, path, description, created_at, updated_at, is_active + FROM projects WHERE id = ?1" + )?; + + let result = stmt.query_row([project_id], |row| { + let created_at_str: String = row.get(4)?; + let updated_at_str: String = row.get(5)?; + + let created_at = DateTime::parse_from_rfc3339(&created_at_str) + .map_err(|_| rusqlite::Error::InvalidColumnType(4, "created_at".to_string(), rusqlite::types::Type::Text))? + .with_timezone(&Utc); + let updated_at = DateTime::parse_from_rfc3339(&updated_at_str) + .map_err(|_| rusqlite::Error::InvalidColumnType(5, "updated_at".to_string(), rusqlite::types::Type::Text))? + .with_timezone(&Utc); + + Ok(Project { + id: row.get(0)?, + name: row.get(1)?, + path: row.get(2)?, + description: row.get(3)?, + created_at, + updated_at, + is_active: row.get::<_, i32>(6)? != 0, + }) + }); + + match result { + Ok(project) => Ok(Some(project)), + Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None), + Err(e) => Err(e.into()), + } } /// 根据片段ID获取片段信息