Add time to timer
This commit is contained in:
79
timer.go
79
timer.go
@ -3,6 +3,7 @@ package main
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
@ -50,12 +51,12 @@ func initializeDatabase(db *sql.DB) error {
|
||||
return err
|
||||
}
|
||||
|
||||
err = insertTimer(tx, "My timer", 600)
|
||||
err = insertTimer(tx, "My timer", 6)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = insertTimer(tx, "My timer2", 600)
|
||||
err = insertTimer(tx, "My timer2", 6)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -86,7 +87,7 @@ func initializeDatabase(db *sql.DB) error {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = tx.Exec(`INSERT INTO Timer VALUES ($1, $2, $3, $4)`, userId, "steven", userUuidStr, password)
|
||||
_, err = tx.Exec(`INSERT INTO User VALUES ($1, $2, $3, $4)`, userId, "steven", userUuidStr, password)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -139,7 +140,17 @@ func deleteTimer(db *sql.DB, idStr string) bool {
|
||||
}
|
||||
|
||||
affected, err := res.RowsAffected()
|
||||
return err == nil && affected > 0
|
||||
return err == nil && affected == 1
|
||||
}
|
||||
|
||||
func updateTimerEndTime(db *sql.DB, id model.UUID, endTime model.Time) bool {
|
||||
res, err := db.Exec("UPDATE Timer SET EndTime=$1 WHERE Id=$2", endTime, id)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
affected, err := res.RowsAffected()
|
||||
return err == nil && affected == 1
|
||||
}
|
||||
|
||||
type Session struct {
|
||||
@ -174,6 +185,65 @@ func (server *MyServer) handleTimer(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
func parseDuration(value string) (time.Duration, error) {
|
||||
const nullDuration = time.Duration(0)
|
||||
if len(value) == 0 {
|
||||
return nullDuration, errors.New("Empty duration string")
|
||||
}
|
||||
|
||||
var unit time.Duration
|
||||
switch value[len(value)-1] {
|
||||
case 's':
|
||||
unit = time.Second
|
||||
case 'm':
|
||||
unit = time.Minute
|
||||
case 'h':
|
||||
unit = time.Hour
|
||||
case 'd':
|
||||
unit = time.Duration(24) * time.Hour
|
||||
case 'w':
|
||||
unit = time.Duration(24*7) * time.Hour
|
||||
default:
|
||||
return nullDuration, errors.New("Invalid duration format")
|
||||
}
|
||||
|
||||
amount, err := strconv.ParseInt(value[0:len(value)-1], 10, 64)
|
||||
if err != nil || amount < 0 {
|
||||
return nullDuration, errors.New("Invalid duration value")
|
||||
}
|
||||
|
||||
return time.Duration(amount) * unit, nil
|
||||
}
|
||||
|
||||
func (server *MyServer) handleTimerAddTime(w http.ResponseWriter, r *http.Request) {
|
||||
timer := queryTimer(server.db, r.PathValue("timerId"))
|
||||
if timer == nil {
|
||||
server.handleNotFound(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
if timer.IsFinished() {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
duration, err := parseDuration(r.PathValue("timeToAdd"))
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
w.Write([]byte(err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
timer.EndTime.Add(duration)
|
||||
res := updateTimerEndTime(server.db, timer.Id, timer.EndTime)
|
||||
if !res {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
view.TimerView(*timer).Render(context.Background(), w)
|
||||
}
|
||||
|
||||
func (server *MyServer) handleDeleteTimer(w http.ResponseWriter, r *http.Request) {
|
||||
success := deleteTimer(server.db, r.PathValue("timerId"))
|
||||
if !success {
|
||||
@ -244,6 +314,7 @@ func main() {
|
||||
http.Handle("GET /static/", http.StripPrefix("/static/", fs))
|
||||
|
||||
http.HandleFunc("GET /timer/{timerId}", myServer.handleTimer)
|
||||
http.HandleFunc("POST /timer/{timerId}/addTime/{timeToAdd}", myServer.handleTimerAddTime)
|
||||
http.HandleFunc("DELETE /timer/{timerId}", myServer.handleDeleteTimer)
|
||||
http.HandleFunc("PUT /timer", myServer.handlePutTimer)
|
||||
http.HandleFunc("GET /", myServer.handleMain)
|
||||
|
Reference in New Issue
Block a user