summaryrefslogtreecommitdiff
path: root/timer.go
diff options
context:
space:
mode:
Diffstat (limited to 'timer.go')
-rw-r--r--timer.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/timer.go b/timer.go
index 5209e73..97dc964 100644
--- a/timer.go
+++ b/timer.go
@@ -6,6 +6,7 @@ import (
"database/sql"
"encoding/base64"
"errors"
+ "fmt"
"log"
"net/http"
"strconv"
@@ -231,6 +232,16 @@ func updateTimerEndTime(db *sql.DB, id model.UUID, endTime model.Time, userId mo
return err == nil && affected == 1
}
+func updateTimerToken(db *sql.DB, id model.UUID, token string, userId model.UUID) bool {
+ res, err := db.Exec("UPDATE Timer SET Token=$1 WHERE Id=$2 AND Owner=$3", token, id, userId)
+ if err != nil {
+ return false
+ }
+
+ affected, err := res.RowsAffected()
+ return err == nil && affected == 1
+}
+
type Session struct {
UserId model.UUID
}
@@ -369,6 +380,51 @@ func (server *MyServer) handleTimerAddTime(w http.ResponseWriter, r *http.Reques
view.TimerView(*timer).Render(context.Background(), w)
}
+func (server *MyServer) handleGetTimerToken(w http.ResponseWriter, r *http.Request) {
+ currentUser := server.findCurrentUser(w, r)
+ if currentUser == nil {
+ w.WriteHeader(http.StatusUnauthorized)
+ return
+ }
+
+ timer := queryTimer(server.db, r.PathValue("timerId"), currentUser.Id)
+ if timer == nil {
+ server.handleNotFound(w, r)
+ return
+ }
+
+ w.Write([]byte(fmt.Sprint("<code>", timer.Token, "</code>")))
+}
+
+func (server *MyServer) handleResetTimerToken(w http.ResponseWriter, r *http.Request) {
+ currentUser := server.findCurrentUser(w, r)
+ if currentUser == nil {
+ w.WriteHeader(http.StatusUnauthorized)
+ return
+ }
+
+ timer := queryTimer(server.db, r.PathValue("timerId"), currentUser.Id)
+ if timer == nil {
+ server.handleNotFound(w, r)
+ return
+ }
+
+ newToken, err := generateTimerToken()
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ timer.Token = newToken
+ res := updateTimerToken(server.db, timer.Id, newToken, currentUser.Id)
+ if !res {
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ view.TimerTokenForm(*timer).Render(context.Background(), w)
+}
+
func (server *MyServer) handleDeleteTimer(w http.ResponseWriter, r *http.Request) {
user := server.findCurrentUser(w, r)
if user == nil {
@@ -505,6 +561,8 @@ func main() {
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("POST /timer/{timerId}/resetToken", myServer.handleResetTimerToken)
+ http.HandleFunc("GET /timer/{timerId}/token", myServer.handleGetTimerToken)
http.HandleFunc("PUT /timer", myServer.handlePutTimer)
http.HandleFunc("GET /", myServer.handleMain)