models.go 2.24 KB
Newer Older
Jisan Ahmed's avatar
Jisan Ahmed committed
package models

import (
	"database/sql"
	"fmt"
)

type Todo struct {
	Id   int
	Name string
	Done bool
}

type TodoModel struct {
	DB *sql.DB
}

func (m *TodoModel) All() ([]*Todo, error) {
	query := "SELECT Id,Name,Done FROM todos"
	_, err := m.DB.Query(query)

	if err != nil {
		return nil, err
	}
	// return nil, nil
	// defer rows.Close()
	// var todos []*Todo

	// for rows.Next() {
	// 	todo := &Todo{}
	// 	err := rows.Scan(&todo.Id, &todo.Name, &todo.Done)
	// 	if err != nil {
	// 		return nil, err
	// 	}
	// 	todos = append(todos, todo)
	// }
	// if err = rows.Err(); err != nil {
	// 	return nil, err
	// }
	return nil, nil

}

func (m *TodoModel) Create(name string) (*Todo, error) {
	if name == "" {
		return nil, fmt.Errorf("name is required")
	}

	if m.DB == nil {
		fmt.Println("Database connection is nil") // Debugging log
		return nil, fmt.Errorf("database connection is nil")
	}

	query := "INSERT INTO todos (Name,Done) VALUES (?,?)"
	result, err := m.DB.Exec(query, name, false)
	if err != nil {
		fmt.Printf("Error executing query: %v\n", err) // Debugging log
		return nil, err
	}

	id, err := result.LastInsertId()
	if err != nil {
		fmt.Printf("Error getting last insert ID: %v\n", err) // Debugging log
		return nil, err
	}

	return &Todo{
		Id:   int(id),
		Name: name,
		Done: false,
	}, nil
}

func (m *TodoModel) Save(name string) error {
	if name == "" {
		return fmt.Errorf("name is required")
	}
	query := "INSERT INTO todos (Name,Done) VALUES (?,?)"
	_, err := m.DB.Exec(query, name, false)
	if err != nil {
		return err
	}
	return nil
}

func (m *TodoModel) Find(id int) (*Todo, error) {
	query := "SELECT Id,Name,Done FROM todos WHERE Id=?"
	row := m.DB.QueryRow(query, id)
	todo := &Todo{}
	err := row.Scan(&todo.Id, &todo.Name, &todo.Done)
	if err != nil {
		if err == sql.ErrNoRows {
			return nil, fmt.Errorf("todo not found")
		}
		return nil, err
	}
	return todo, nil

}

func (m *TodoModel) Update(id int, name string, done bool) error {
	query := "UPDATE todos SET Name=?,Done=? WHERE Id=?"
	_, err := m.DB.Exec(query, id, name, done)
	if err != nil {
		return err
	}
	return nil
}

func (m *TodoModel) Delete(id int) error {
	query := "DELETE FROM todos WHERE Id=?"
	_, err := m.DB.Exec(query, id)
	if err != nil {
		return err
	}
	return nil
}