2025-05-08 11:51:16 +02:00

89 lines
1.7 KiB
Go

package main
import (
"errors"
"gitea.seeseepuff.be/seeseemelk/mysqlite"
"log"
)
type Db struct {
db *mysqlite.Db
}
func NewDb(datasource string) *Db {
// Open a file-based database
db, err := mysqlite.OpenDb(datasource)
if err != nil {
log.Fatal(err)
}
// Apply migrations
err = db.MigrateDb(migrations, "migrations")
if err != nil {
log.Fatal(err)
}
return &Db{db: db}
}
func (db *Db) GetUsers() ([]User, error) {
var err error
users := make([]User, 0)
for row := range db.db.Query("select id, name from users").Range(&err) {
user := User{}
err = row.Scan(&user.ID, &user.Name)
if err != nil {
return nil, err
}
users = append(users, user)
}
if err != nil {
return nil, err
}
return users, nil
}
func (db *Db) GetUser(id int) (*User, error) {
user := &User{}
err := db.db.Query("select id, name from users where id = ?").
Bind(id).ScanSingle(&user.ID, &user.Name)
if errors.Is(err, mysqlite.ErrNoRows) {
return nil, nil
}
if err != nil {
return nil, err
}
return user, nil
}
func (db *Db) UserExists(userId int) (bool, error) {
count := 0
err := db.db.Query("select count(*) from users where id = ?").
Bind(userId).ScanSingle(&count)
if err != nil {
return false, err
}
return count > 0, nil
}
func (db *Db) GetUserGoals(userId int) ([]Goal, error) {
goals := make([]Goal, 0)
var err error
for row := range db.db.Query("select id, name, target, progress, weight from goals where user_id = ?").
Bind(userId).Range(&err) {
goal := Goal{}
err = row.Scan(&goal.ID, &goal.Name, &goal.Target, &goal.Progress, &goal.Weight)
if err != nil {
return nil, err
}
goals = append(goals, goal)
}
if err != nil {
return nil, err
}
return goals, nil
}