use crate::board::model::Board;
use crate::database::get_connection;
use rusqlite::{params, Result};
pub fn add(board: &Board) -> Result<()> {
let connection = get_connection()?;
connection.execute(
"
INSERT INTO board (name, location)
VALUES(?1, ?2);
",
params![board.name, board.location],
)?;
Ok(())
}
pub fn get_all() -> Result<Vec<Board>> {
let connection = get_connection()?;
let mut statement = connection.prepare("SELECT * FROM board;")?;
let board_iter = statement.query_map([], |row| {
Ok(Board {
id: row.get(0)?,
name: row.get(1)?,
location: row.get(2)?,
ticket_count: row.get(3)?,
})
})?;
let mut boards = Vec::new();
for board_result in board_iter {
match board_result {
Ok(board) => boards.push(board),
Err(value) => println!("Failed to retrieve boards from database: {}", value),
}
}
Ok(boards)
}
pub fn get_by_location(location: &String) -> Result<Board> {
let connection = get_connection()?;
let mut statement = connection.prepare("SELECT * FROM board WHERE location=?;")?;
let row = statement.query_row(params![location], |row| {
Ok(Board {
id: row.get(0)?,
name: row.get(1)?,
location: row.get(2)?,
ticket_count: row.get(3)?,
})
})?;
Ok(row)
}
pub fn delete(board_id: usize) -> Result<()> {
let connection = get_connection()?;
connection.execute("DELETE FROM board where id=?1;", params![board_id])?;
Ok(())
}
pub fn increment_and_get_ticket_count(board_id: usize) -> Result<usize> {
let connection = get_connection()?;
let mut statement = connection.prepare(
"UPDATE board SET ticket_count=ticket_count+1 WHERE id=? RETURNING ticket_count",
)?;
let incremented_ticket_count = statement.query_row(params![board_id], |row| {
let row: usize = row.get(0)?;
Ok(row)
})?;
Ok(incremented_ticket_count)
}