Skip to main content

chainlink/db/
archive.rs

1use anyhow::Result;
2use chrono::Utc;
3use rusqlite::params;
4
5use super::{issue_from_row, Database};
6use crate::models::Issue;
7
8impl Database {
9    pub fn archive_issue(&self, id: i64) -> Result<bool> {
10        let now = Utc::now().to_rfc3339();
11        let rows = self.conn.execute(
12            "UPDATE issues SET status = 'archived', updated_at = ?1 WHERE id = ?2 AND status = 'closed'",
13            params![now, id],
14        )?;
15        Ok(rows > 0)
16    }
17
18    pub fn unarchive_issue(&self, id: i64) -> Result<bool> {
19        let now = Utc::now().to_rfc3339();
20        let rows = self.conn.execute(
21            "UPDATE issues SET status = 'closed', updated_at = ?1 WHERE id = ?2 AND status = 'archived'",
22            params![now, id],
23        )?;
24        Ok(rows > 0)
25    }
26
27    pub fn list_archived_issues(&self) -> Result<Vec<Issue>> {
28        let mut stmt = self.conn.prepare(
29            "SELECT id, title, description, status, priority, parent_id, created_at, updated_at, closed_at FROM issues WHERE status = 'archived' ORDER BY id DESC",
30        )?;
31
32        let issues = stmt
33            .query_map([], issue_from_row)?
34            .collect::<std::result::Result<Vec<_>, _>>()?;
35
36        Ok(issues)
37    }
38
39    pub fn archive_older_than(&self, days: i64) -> Result<i32> {
40        let cutoff = Utc::now() - chrono::Duration::days(days);
41        let cutoff_str = cutoff.to_rfc3339();
42        let now = Utc::now().to_rfc3339();
43
44        let rows = self.conn.execute(
45            "UPDATE issues SET status = 'archived', updated_at = ?1 WHERE status = 'closed' AND closed_at < ?2",
46            params![now, cutoff_str],
47        )?;
48
49        Ok(rows as i32)
50    }
51}