From e7800492c36efffc373c0926a8962b4eff768a4e Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Wed, 17 Apr 2024 00:04:57 +0200 Subject: [PATCH] Timer addTime API --- timer.db | Bin 28672 -> 28672 bytes timer.go | 82 ++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 60 insertions(+), 22 deletions(-) diff --git a/timer.db b/timer.db index 2b944ed9c05a802d140988a327edbb564f663149..ac83467a090bb963e78d4ad70f586372d61e74c9 100644 GIT binary patch delta 334 zcmZp8z}WDBae_2s-b5K^#=MOQ2J-bLR;H#_M&?nBeJ>WY8kE&EoIIkna_1UF*AU-C zM`x3al+^GX-#q7vqAbTs6GL-vpRAmSkg5oM-(*9RBv)s%h^p-5FhA1>Q;!@o_o|%o zg5)3*{gTYEl0?t4@W_(nib{_R{eTdYuwW0PqQWA7E(Qh$M*cSp{BQWL^B-c^%&#z0 PK7v-3ZE{$lPcy>-PNs4w delta 334 zcmZp8z}WDBae_2s`a~IL#`KK|2J-dBRwf2kM&?nBeJ>WY8kE&EoIIkna_1VwY{x=l z509Y0oB*Rruhbm3KttDbcUQwgXD>4&7axy8pQI!oqr^l%mmo)d?TR9=5_9*EC|5)G ztU}M=lC1FH>@b(AsL1dn(}0qsvU2^v;%xWy>=1n;E(Qh$M*cSp{BQWL^B-c^%&#z0 PK7v-3ZE{$lPcy>-H9Bsy diff --git a/timer.go b/timer.go index 610de82..a45ad3a 100644 --- a/timer.go +++ b/timer.go @@ -191,7 +191,7 @@ func queryUserById(db *sql.DB, id model.UUID) *model.User { return &user } -func queryTimer(db *sql.DB, idStr string, userId model.UUID) *model.Timer { +func queryTimerFromUser(db *sql.DB, idStr string, userId model.UUID) *model.Timer { var id model.UUID if err := id.Scan(idStr); err != nil { return nil @@ -207,6 +207,22 @@ func queryTimer(db *sql.DB, idStr string, userId model.UUID) *model.Timer { return nil } +func queryTimerFromToken(db *sql.DB, idStr string, token string) *model.Timer { + var id model.UUID + if err := id.Scan(idStr); err != nil { + return nil + } + + row := db.QueryRow("SELECT Id, Name, StartTime, EndTime, Owner, Token FROM Timer WHERE Id=$1 AND Token=$2", id, token) + + var t model.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, idStr string, userId model.UUID) bool { var id model.UUID if err := id.Scan(idStr); err != nil { @@ -307,7 +323,7 @@ func (server *MyServer) handleTimer(w http.ResponseWriter, r *http.Request) { return } - timer := queryTimer(server.db, r.PathValue("timerId"), currentUser.Id) + timer := queryTimerFromUser(server.db, r.PathValue("timerId"), currentUser.Id) if timer != nil && timer.Owner == currentUser.Id { view.Main(view.TimerView(*timer), currentUser).Render(context.Background(), w) } else { @@ -345,6 +361,30 @@ func parseDuration(value string) (time.Duration, error) { return time.Duration(amount) * unit, nil } +func (server *MyServer) handleTimerAddTimeCommon(w http.ResponseWriter, r *http.Request, timer *model.Timer) bool { + if timer.IsFinished() { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte("Timer already finished")) + return false + } + + duration, err := parseDuration(r.FormValue("timeToAdd")) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) + return false + } + + timer.EndTime.Add(duration) + res := updateTimerEndTime(server.db, timer.Id, timer.EndTime, timer.Owner) + if !res { + w.WriteHeader(http.StatusInternalServerError) + return false + } + + return true +} + func (server *MyServer) handleTimerAddTime(w http.ResponseWriter, r *http.Request) { currentUser := server.findCurrentUser(w, r) if currentUser == nil { @@ -352,34 +392,31 @@ func (server *MyServer) handleTimerAddTime(w http.ResponseWriter, r *http.Reques return } - timer := queryTimer(server.db, r.PathValue("timerId"), currentUser.Id) + timer := queryTimerFromUser(server.db, r.PathValue("timerId"), currentUser.Id) if timer == nil { - server.handleNotFound(w, r) + w.WriteHeader(http.StatusNotFound) return } - if timer.IsFinished() { - w.WriteHeader(http.StatusBadRequest) - return - } - - duration, err := parseDuration(r.FormValue("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, currentUser.Id) - if !res { - w.WriteHeader(http.StatusBadRequest) + if !server.handleTimerAddTimeCommon(w, r, timer) { return } view.TimerInfo(*timer).Render(context.Background(), w) } +func (server *MyServer) handleApiTimerAddTime(w http.ResponseWriter, r *http.Request) { + timer := queryTimerFromToken(server.db, r.PathValue("timerId"), r.FormValue("token")) + if timer == nil { + w.WriteHeader(http.StatusNotFound) + return + } + + if !server.handleTimerAddTimeCommon(w, r, timer) { + return + } +} + func (server *MyServer) handleGetTimerToken(w http.ResponseWriter, r *http.Request) { currentUser := server.findCurrentUser(w, r) if currentUser == nil { @@ -387,7 +424,7 @@ func (server *MyServer) handleGetTimerToken(w http.ResponseWriter, r *http.Reque return } - timer := queryTimer(server.db, r.PathValue("timerId"), currentUser.Id) + timer := queryTimerFromUser(server.db, r.PathValue("timerId"), currentUser.Id) if timer == nil { server.handleNotFound(w, r) return @@ -403,7 +440,7 @@ func (server *MyServer) handleResetTimerToken(w http.ResponseWriter, r *http.Req return } - timer := queryTimer(server.db, r.PathValue("timerId"), currentUser.Id) + timer := queryTimerFromUser(server.db, r.PathValue("timerId"), currentUser.Id) if timer == nil { server.handleNotFound(w, r) return @@ -569,6 +606,7 @@ func main() { http.HandleFunc("POST /logout", myServer.handlePostLogout) http.HandleFunc("GET /timer/{timerId}", myServer.handleTimer) http.HandleFunc("POST /timer/{timerId}/addTime", myServer.handleTimerAddTime) + http.HandleFunc("POST /api/timer/{timerId}/addTime", myServer.handleApiTimerAddTime) http.HandleFunc("DELETE /timer/{timerId}", myServer.handleDeleteTimer) http.HandleFunc("POST /timer/{timerId}/resetToken", myServer.handleResetTimerToken) http.HandleFunc("GET /timer/{timerId}/token", myServer.handleGetTimerToken)