Skip to main content

cc_switch_lib/database/dao/
prompts.rs

1//! 提示词数据访问对象
2//!
3//! 提供提示词(Prompt)的 CRUD 操作。
4
5use crate::database::{lock_conn, Database};
6use crate::error::AppError;
7use crate::prompt::Prompt;
8use indexmap::IndexMap;
9use rusqlite::params;
10
11impl Database {
12    /// 获取指定应用类型的所有提示词
13    pub fn get_prompts(&self, app_type: &str) -> Result<IndexMap<String, Prompt>, AppError> {
14        let conn = lock_conn!(self.conn);
15        let mut stmt = conn
16            .prepare(
17                "SELECT id, name, content, description, enabled, created_at, updated_at
18             FROM prompts WHERE app_type = ?1
19             ORDER BY created_at ASC, id ASC",
20            )
21            .map_err(|e| AppError::Database(e.to_string()))?;
22
23        let prompt_iter = stmt
24            .query_map(params![app_type], |row| {
25                let id: String = row.get(0)?;
26                let name: String = row.get(1)?;
27                let content: String = row.get(2)?;
28                let description: Option<String> = row.get(3)?;
29                let enabled: bool = row.get(4)?;
30                let created_at: Option<i64> = row.get(5)?;
31                let updated_at: Option<i64> = row.get(6)?;
32
33                Ok((
34                    id.clone(),
35                    Prompt {
36                        id,
37                        name,
38                        content,
39                        description,
40                        enabled,
41                        created_at,
42                        updated_at,
43                    },
44                ))
45            })
46            .map_err(|e| AppError::Database(e.to_string()))?;
47
48        let mut prompts = IndexMap::new();
49        for prompt_res in prompt_iter {
50            let (id, prompt) = prompt_res.map_err(|e| AppError::Database(e.to_string()))?;
51            prompts.insert(id, prompt);
52        }
53        Ok(prompts)
54    }
55
56    /// 保存提示词
57    pub fn save_prompt(&self, app_type: &str, prompt: &Prompt) -> Result<(), AppError> {
58        let conn = lock_conn!(self.conn);
59        conn.execute(
60            "INSERT OR REPLACE INTO prompts (
61                id, app_type, name, content, description, enabled, created_at, updated_at
62            ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)",
63            params![
64                prompt.id,
65                app_type,
66                prompt.name,
67                prompt.content,
68                prompt.description,
69                prompt.enabled,
70                prompt.created_at,
71                prompt.updated_at,
72            ],
73        )
74        .map_err(|e| AppError::Database(e.to_string()))?;
75        Ok(())
76    }
77
78    /// 删除提示词
79    pub fn delete_prompt(&self, app_type: &str, id: &str) -> Result<(), AppError> {
80        let conn = lock_conn!(self.conn);
81        conn.execute(
82            "DELETE FROM prompts WHERE id = ?1 AND app_type = ?2",
83            params![id, app_type],
84        )
85        .map_err(|e| AppError::Database(e.to_string()))?;
86        Ok(())
87    }
88}