diff options
Diffstat (limited to 'model')
-rw-r--r-- | model/timer.go | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/model/timer.go b/model/timer.go index 27e46da..3f13d0d 100644 --- a/model/timer.go +++ b/model/timer.go @@ -1,5 +1,17 @@ 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 @@ -12,3 +24,87 @@ type Timer struct { 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 +} |