diff --git a/src/app.rs b/src/app.rs index a0d563e..2a3b1ff 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,6 +1,5 @@ // use indexmap::IndexMap; // use int_enum::IntEnum; -// use crate::get_all_tasks; use rusqlite::Connection; use serde::{Deserialize, Serialize}; use std::cmp::min; @@ -22,6 +21,7 @@ pub struct Column { #[derive(Clone, Default, Deserialize, Serialize, Debug)] pub struct Task { + pub id: i64, pub title: String, pub description: String, } @@ -71,7 +71,7 @@ impl Default for TaskState<'_> { pub struct State<'a> { pub project: Project, - pub db_pool: Connection, + pub db_conn: Connection, pub quit: bool, pub columns: Vec, pub task_edit_state: Option>, @@ -83,7 +83,7 @@ impl State<'_> { State { quit: false, task_edit_state: None, - db_pool, + db_conn: db_pool, project, columns: vec![], } @@ -100,10 +100,9 @@ impl<'a> Column { } } - pub fn add_task(&mut self, title: String, description: String) { - let task = Task { title, description }; + pub fn add_task(&mut self, task: Task) { self.tasks.push(task); - self.select_next_task(); + self.select_last_task(); } pub fn remove_task(&mut self) { diff --git a/src/db.rs b/src/db.rs index 3747eda..f7b55f7 100644 --- a/src/db.rs +++ b/src/db.rs @@ -1,10 +1,10 @@ -use crate::{Task}; -use rusqlite::{Connection, Result}; +use crate::{Column, Task}; +use rusqlite::{params, Connection, Result}; pub fn get_tasks_by_column(conn: &Connection, column_name: &String) -> Result> { let mut stmt = conn.prepare( r#" - select title, description from task + select task.id, title, description from task join kb_column on column_id = kb_column.id where kb_column.name = ?1 "#, @@ -12,8 +12,9 @@ pub fn get_tasks_by_column(conn: &Connection, column_name: &String) -> Result Result Result)>> { let mut stmt = conn.prepare("select name from kb_column")?; - let columns = stmt.query_map((), |row| { - Ok(row.get::(0)?) - })?; + let columns = stmt.query_map((), |row| Ok(row.get::(0)?))?; let mut tasks_by_column: Vec<(String, Vec)> = Vec::new(); for col in columns { let name = &col?; @@ -36,13 +35,23 @@ pub fn get_all_tasks(conn: &Connection) -> Result)>> { Ok(tasks_by_column) } -// pub async fn insert_new_task(pool: &SqlitePool, task: &Task, column: &Column) { -// // TODO: You have to add the id to the column -// sqlx::query!("insert into task(title, description, column_id) values (?1, ?2, ?3)", task.title, task.description, 1) -// .execute(pool) -// .await -// .unwrap(); -// } +pub fn insert_new_task(conn: &Connection, title: String, description: String, _column: &Column) -> Task { + let mut stmt = conn + .prepare("insert into task(title, description, column_id) values (?1, ?2, ?3)") + .unwrap(); + stmt.execute(params![title, description, 1]) + .unwrap(); + let id = conn.last_insert_rowid(); + Task { id, title, description } +} + +pub fn delete_task(conn: &Connection, task: &Task) { + let mut stmt = conn + .prepare("delete from task where id = ?1") + .unwrap(); + stmt.execute([task.id]) + .unwrap(); +} // pub async fn update_task(pool: &SqlitePool, task: &Task) { // sqlx::query!("update task set title = ?1, description = ?2", task.title, task.description) @@ -66,11 +75,3 @@ pub fn get_all_tasks(conn: &Connection) -> Result)>> { // .await // .unwrap(); // } - -// pub async fn delete_task(pool: &SqlitePool, task: &Task) { -// // TODO: We have to add ids to tasks -// sqlx::query!("delete from task where id = ?1", 1) -// .execute(pool) -// .await -// .unwrap(); -// } diff --git a/src/input.rs b/src/input.rs index b7e5185..e0022a7 100644 --- a/src/input.rs +++ b/src/input.rs @@ -1,4 +1,5 @@ use crate::app::{State, TaskEditFocus, TaskState}; +use crate::{db}; use crossterm::event; use crossterm::event::{Event, KeyCode}; @@ -41,7 +42,8 @@ pub fn handle(state: &mut State<'_>) -> Result<(), std::io::Error> { selected_task.description = description; } } else { - column.add_task(title, description); + let task = db::insert_new_task(&state.db_conn, title, description, &column); + column.add_task(task); } state.task_edit_state = None; project.save(); @@ -80,7 +82,8 @@ pub fn handle(state: &mut State<'_>) -> Result<(), std::io::Error> { } KeyCode::Char('D') => { column.remove_task(); - project.save(); + db::delete_task(&state.db_conn, column.get_selected_task().unwrap()); + // project.save(); } _ => {} },