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}