persistence.rs

 1use anyhow::Result;
 2use db::{
 3    query,
 4    sqlez::{domain::Domain, statement::Statement, thread_safe_connection::ThreadSafeConnection},
 5    sqlez_macros::sql,
 6};
 7use workspace::{ItemId, WorkspaceDb, WorkspaceId};
 8
 9pub struct ComponentPreviewDb(ThreadSafeConnection);
10
11impl Domain for ComponentPreviewDb {
12    const NAME: &str = stringify!(ComponentPreviewDb);
13
14    const MIGRATIONS: &[&str] = &[sql!(
15            CREATE TABLE component_previews (
16                workspace_id INTEGER,
17                item_id INTEGER UNIQUE,
18                active_page_id TEXT,
19                PRIMARY KEY(workspace_id, item_id),
20                FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
21                ON DELETE CASCADE
22            ) STRICT;
23    )];
24}
25
26db::static_connection!(COMPONENT_PREVIEW_DB, ComponentPreviewDb, [WorkspaceDb]);
27
28impl ComponentPreviewDb {
29    pub async fn save_active_page(
30        &self,
31        item_id: ItemId,
32        workspace_id: WorkspaceId,
33        active_page_id: String,
34    ) -> Result<()> {
35        log::debug!(
36            "Saving active page: item_id={item_id:?}, workspace_id={workspace_id:?}, active_page_id={active_page_id}"
37        );
38        let query = "INSERT INTO component_previews(item_id, workspace_id, active_page_id)
39            VALUES (?1, ?2, ?3)
40            ON CONFLICT DO UPDATE SET
41                active_page_id = ?3";
42        self.write(move |conn| {
43            let mut statement = Statement::prepare(conn, query)?;
44            let mut next_index = statement.bind(&item_id, 1)?;
45            next_index = statement.bind(&workspace_id, next_index)?;
46            statement.bind(&active_page_id, next_index)?;
47            statement.exec()
48        })
49        .await
50    }
51
52    query! {
53        pub fn get_active_page(item_id: ItemId, workspace_id: WorkspaceId) -> Result<Option<String>> {
54            SELECT active_page_id
55            FROM component_previews
56            WHERE item_id = ? AND workspace_id = ?
57        }
58    }
59}