You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
1.7 KiB

package database
import (
"log"
"github.com/jmoiron/sqlx"
_ "modernc.org/sqlite"
)
type DB struct {
db *sqlx.DB
}
func New() *DB {
d := &DB{}
con, err := sqlx.Open("sqlite", "./todogo.db")
if err != nil {
log.Fatal(err)
}
d.db = con
err = d.init()
if err != nil {
log.Fatal(err)
}
return d
}
func (d *DB) init() error {
d.migrate()
return nil
}
func (d *DB) InsertTodo(title string) error {
_, err := d.db.Exec("INSERT INTO todos(title, completed) VALUES(?, ?)", title, 0)
return err
}
func (d *DB) ToggleTodo(id int) error {
_, err := d.db.Exec(`
UPDATE todos
SET completed = (CASE WHEN completed = 0 THEN 1 ELSE 0 END)
WHERE id = ?
`, id)
return err
}
func (d *DB) DeleteTodo(id int) error {
_, err := d.db.Exec("DELETE FROM todos WHERE id = ?", id)
return err
}
func (d *DB) GetAllTodos() ([]Todo, error) {
todos := []Todo{}
err := d.db.Select(&todos, "SELECT id, title, completed FROM todos")
if err != nil {
return nil, err
}
return todos, nil
}
func (d *DB) GetTodosByCompleted(completed bool) ([]Todo, error) {
completedInt := 0
if completed {
completedInt = 1
}
todos := []Todo{}
err := d.db.Select(&todos, "SELECT id, title, completed FROM todos WHERE completed = ?", completedInt)
if err != nil {
return nil, err
}
return todos, nil
}
func (d *DB) GetIncompleteTodosCount() int {
var count int
err := d.db.Get(&count, "SELECT COUNT(*) FROM todos WHERE completed = 0")
if err != nil {
log.Printf("failed to get incomplete count")
return 0
}
return count
}
func (d *DB) DeleteCompletedTodos() error {
_, err := d.db.Exec("DELETE FROM todos WHERE completed = 1")
return err
}
type Todo struct {
Id int
Title string
Completed bool
}