package model import ( "database/sql" "log" "time" "stevenlr.com/timer/utils" ) func GenerateTimerToken() (string, error) { return utils.GenerateRandomString(66) } type Timer struct { Id UUID Name string StartTime Time EndTime Time Owner UUID Token string } func (self Timer) IsFinished() bool { return MakeTimeNow().Compare(self.EndTime) >= 0 } func InsertTimer(tx *sql.Tx, name string, seconds int, ownerId UUID) error { now := MakeTimeNow() end := Time(time.Time(now).Add(time.Duration(seconds) * time.Second)) id := MakeUUID() token, _ := GenerateTimerToken() _, err := tx.Exec(` INSERT INTO Timer VALUES ($1, $2, $3, $4, $5, $6)`, id, name, now, end, ownerId, token) return err } func GetTimersForUser(db *sql.DB, owner UUID) []Timer { rows, err := db.Query("SELECT Id, Name FROM Timer WHERE Owner=$1", owner) if err != nil { log.Fatalln(err) } timers := []Timer{} for rows.Next() { var t Timer if err := rows.Scan(&t.Id, &t.Name); err == nil { timers = append(timers, t) } } return timers } func GetTimerForUser(db *sql.DB, id UUID, userId UUID) *Timer { row := db.QueryRow("SELECT Id, Name, StartTime, EndTime, Owner, Token FROM Timer WHERE Id=$1 AND Owner=$2", id, userId) var t Timer if err := row.Scan(&t.Id, &t.Name, &t.StartTime, &t.EndTime, &t.Owner, &t.Token); err == nil { return &t } return nil } func GetTimerWithToken(db *sql.DB, id UUID, token string) *Timer { row := db.QueryRow("SELECT Id, Name, StartTime, EndTime, Owner, Token FROM Timer WHERE Id=$1 AND Token=$2", id, token) var t Timer if err := row.Scan(&t.Id, &t.Name, &t.StartTime, &t.EndTime, &t.Owner, &t.Token); err == nil { return &t } return nil } func DeleteTimer(db *sql.DB, id UUID, userId UUID) bool { res, err := db.Exec("DELETE FROM Timer WHERE Id=$1 AND Owner=$2", id, userId) if err != nil { return false } affected, err := res.RowsAffected() return err == nil && affected == 1 } func UpdateTimerEndTime(db *sql.DB, id UUID, endTime Time, userId UUID) bool { res, err := db.Exec("UPDATE Timer SET EndTime=$1 WHERE Id=$2 AND Owner=$3", endTime, id, userId) if err != nil { return false } affected, err := res.RowsAffected() return err == nil && affected == 1 } func RegenerateTimerToken(db *sql.DB, id UUID, userId UUID) bool { newToken, err := GenerateTimerToken() if err != nil { return false } res, err := db.Exec("UPDATE Timer SET Token=$1 WHERE Id=$2 AND Owner=$3", newToken, id, userId) if err != nil { return false } affected, err := res.RowsAffected() return err == nil && affected == 1 }