89 lines
1.7 KiB
Go
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
|
|
}
|