feat(handlers/study-session): use slogger #8

merged
opened by brookjeynes.dev targeting master from push-trrpxxyxxmot
Changed files
+58 -47
internal
server
handlers
+58 -47
internal/server/handlers/study-session.go
···
import (
"errors"
"fmt"
-
"log"
"net/http"
"strconv"
"time"
···
}
func (h *Handler) HandleStudySessionFeed(w http.ResponseWriter, r *http.Request) {
+
l := h.Logger.With("handler", "HandleStudySessionFeed")
+
isFriends, err := strconv.ParseBool(r.URL.Query().Get("friends"))
if err != nil {
-
log.Println("failed to parse friends value:", err)
+
l.Error("failed to parse friends value", "err", err)
isFriends = false
}
···
}
page, err := strconv.ParseInt(pageStr, 10, 64)
if err != nil {
-
log.Println("failed to parse page value:", err)
+
l.Error("failed to parse page value", "err", err)
page = 1
}
if page == 0 {
···
if !isFriends {
feed, err = db.GetStudySessionFeed(h.Db, pageSize+1, int(offset))
if err != nil {
-
log.Println("failed to get global feed:", err)
+
l.Error("failed to get global feed", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to get global study session feed, try again later.")
return
}
err = h.GetBskyProfileHydratedSessionFeed(feed)
if err != nil {
-
log.Println("failed to hydrate bsky profiles:", err)
+
l.Error("failed to hydrate bsky profiles", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to get global study session feed, try again later.")
return
}
} else {
if fetchUserError != nil {
-
log.Println("failed to get logged-in user:", err)
+
l.Error("failed to get logged-in user", "err", err)
htmx.HxRedirect(w, "/login")
return
}
feed, err = db.GetFriendsStudySessionFeed(h.Db, user.Did, pageSize+1, int(offset))
if err != nil {
-
log.Println("failed to get global feed:", err)
+
l.Error("failed to get global feed", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to get global study session feed, try again later.")
return
}
err = h.GetBskyProfileHydratedSessionFeed(feed)
if err != nil {
-
log.Println("failed to hydrate bsky profiles:", err)
+
l.Error("failed to hydrate bsky profiles", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to get global study session feed, try again later.")
return
}
···
feed, err = ApplyPendingChanges(h, w, r, feed, PendingStudySessionCreation, PendingStudySessionUpdates, PendingStudySessionDeletion)
if err != nil {
-
log.Printf("failed to save yoten-session after processing pending changes: %v", err)
+
l.Error("failed to save yoten-session after processing pending changes", "err", err)
}
nextPage := 0
···
}
func (h *Handler) HandleEditStudySessionPage(w http.ResponseWriter, r *http.Request) {
+
l := h.Logger.With("handler", "HandleEditStudySessionPage")
+
client, err := h.Oauth.AuthorizedClient(r)
if err != nil {
-
log.Println("failed to get authorized client:", err)
+
l.Error("failed to get authorized client", "err", err)
htmx.HxRedirect(w, "/login")
return
}
user, err := bsky.GetUserWithBskyProfile(h.Oauth, r)
if err != nil {
-
log.Println("failed to get logged-in user:", err)
+
l.Error("failed to get logged-in user", "err", err)
htmx.HxRedirect(w, "/login")
return
}
···
rkey := chi.URLParam(r, "rkey")
studySession, err := db.GetStudySessionByRkey(h.Db, user.Did, rkey)
if err != nil {
-
log.Println("failed to get study session from db:", err)
+
l.Error("failed to get study session from db", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to update study session, try again later.")
return
}
if user.Did != studySession.Did {
-
log.Printf("user '%s' does not own record '%s'", user.Did, studySession.Rkey)
+
l.Error("user does not own record", "did", user.Did, "sessionDid", studySession.Did)
htmx.HxError(w, http.StatusUnauthorized, "You do not have permissions to edit this study session.")
return
}
···
case http.MethodGet:
userDefinedActivities, err := db.GetActivitiesByDid(h.Db, user.Did)
if err != nil {
-
log.Println("failed to get user-defined activities:", err)
+
l.Error("failed to get user-defined activities", "err", err)
}
resources, err := db.GetResourcesByDid(h.Db, user.Did)
if err != nil {
-
log.Println("failed to get user-defined resources:", err)
+
l.Error("failed to get user-defined resources", "err", err)
}
preDefinedActivities, err := db.GetPredefinedActivities(h.Db)
if err != nil {
-
log.Println("failed to get pre-defined activities:", err)
+
l.Error("failed to get pre-defined activities", "err", err)
}
currentResource := studySession.Resource
···
languages, err := db.GetProfileLanguages(h.Db, user.Did)
if err != nil {
-
log.Println("failed to fetch profile languages:", err)
+
l.Error("failed to fetch profile languages", "err", err)
}
views.EditStudySessionPage(views.EditStudySessionPageParams{
···
case http.MethodPost:
updatedStudySession, err := h.parseStudySessionForm(r)
if err != nil {
-
log.Println("invalid study session form:", err)
+
l.Error("invalid study session form", "err", err)
htmx.HxError(w, http.StatusBadRequest, "Failed to update study session, ensure all data is valid.")
return
}
···
updatedStudySession.CreatedAt = studySession.CreatedAt
if err := db.ValidateStudySession(updatedStudySession); err != nil {
-
log.Println("invalid study session:", err)
+
l.Error("invalid study session", "err", err)
switch {
case errors.Is(err, db.ErrSessionDescriptionTooLong):
htmx.HxError(w, http.StatusBadRequest, "Study session description cannot be more than 256 characters.")
···
SwapRecord: cid,
})
if err != nil {
-
log.Println("failed to update study session record:", err)
+
l.Error("failed to update study session record", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to update study session, try again later.")
return
}
err = SavePendingUpdate(h, w, r, PendingStudySessionUpdates, updatedStudySession)
if err != nil {
-
log.Printf("failed to save yoten-session to add pending study session updates: %v", err)
+
l.Error("failed to save yoten-session to add pending study session updates", "err", err)
}
if !h.Config.Core.Dev {
···
Set("rkey", rkey),
})
if err != nil {
-
log.Println("failed to enqueue posthog event:", err)
+
l.Error("failed to enqueue posthog event", "err", err)
}
}
···
}
func (h *Handler) HandleNewStudySessionPage(w http.ResponseWriter, r *http.Request) {
+
l := h.Logger.With("handler", "HandleNewStudySessionPage")
+
user, err := bsky.GetUserWithBskyProfile(h.Oauth, r)
if err != nil {
-
log.Println("failed to get logged-in user:", err)
+
l.Error("failed to get logged-in user", "err", err)
htmx.HxRedirect(w, "/login")
return
}
client, err := h.Oauth.AuthorizedClient(r)
if err != nil {
-
log.Println("failed to get authorized client:", err)
+
l.Error("failed to get authorized client", "err", err)
htmx.HxRedirect(w, "/login")
return
}
···
case http.MethodGet:
profile, err := db.GetProfile(h.Db, user.Did)
if err != nil {
-
log.Printf("failed to find %s in db: %s", user.Did, err)
+
l.Error("failed to find user in db", "did", user.Did, "err", err)
htmx.HxError(w, http.StatusNotFound, "Failed to find user.")
return
}
userDefinedActivities, err := db.GetActivitiesByDid(h.Db, user.Did)
if err != nil {
-
log.Println("failed to get user-defined activities:", err)
+
l.Error("failed to get user-defined activities", "err", err)
}
preDefinedActivities, err := db.GetPredefinedActivities(h.Db)
if err != nil {
-
log.Println("failed to get pre-defined activities:", err)
+
l.Error("failed to get pre-defined activities", "err", err)
}
activeActivities := utils.Filter(userDefinedActivities, func(activity db.Activity) bool {
return activity.Status != db.Deleted
···
resources, err := db.GetResourcesByDid(h.Db, user.Did)
if err != nil {
-
log.Println("failed to get user-defined resources:", err)
+
l.Error("failed to get user-defined resources", "err", err)
}
activeResources := utils.Filter(resources, func(resource db.Resource) bool {
return resource.Status != db.Deleted
···
case http.MethodPost:
newStudySession, err := h.parseStudySessionForm(r)
if err != nil {
-
log.Println("invalid study session form:", err)
+
l.Error("invalid study session form", "err", err)
htmx.HxError(w, http.StatusBadRequest, "Failed to update study session, ensure all data is valid.")
return
}
···
}
if err := db.ValidateStudySession(newStudySession); err != nil {
-
log.Println("invalid study session:", err)
+
l.Error("invalid study session", "err", err)
switch {
case errors.Is(err, db.ErrSessionDescriptionTooLong):
htmx.HxError(w, http.StatusBadRequest, "Study session description cannot be more than 256 characters.")
···
},
})
if err != nil {
-
log.Println("failed to create study session record:", err)
+
l.Error("failed to create study session record", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to create study session, try again later.")
return
}
err = SavePendingCreate(h, w, r, PendingStudySessionCreation, newStudySession)
if err != nil {
-
log.Printf("failed to save yoten-session to add pending study session creation: %v", err)
+
l.Error("failed to save yoten-session to add pending study session creation", "err", err)
}
if !h.Config.Core.Dev {
···
Set("date_is_today", newStudySession.Date.Truncate(24*time.Hour).Equal(time.Now().UTC().In(loc).Truncate(24*time.Hour))),
})
if err != nil {
-
log.Println("failed to enqueue posthog event:", err)
+
l.Error("failed to enqueue posthog event", "err", err)
}
}
···
}
func (h *Handler) HandleDeleteStudySession(w http.ResponseWriter, r *http.Request) {
+
l := h.Logger.With("handler", "HandleDeleteStudySession")
+
user := h.Oauth.GetUser(r)
if user == nil {
-
log.Println("failed to get logged-in user")
+
l.Error("failed to get logged-in user")
htmx.HxRedirect(w, "/login")
return
}
client, err := h.Oauth.AuthorizedClient(r)
if err != nil {
-
log.Println("failed to get authorized client:", err)
+
l.Error("failed to get authorized client", "err", err)
htmx.HxError(w, http.StatusUnauthorized, "Failed to delete study session, try again later.")
return
}
···
case http.MethodDelete:
err := r.ParseForm()
if err != nil {
-
log.Println("failed to parse study session delete form:", err)
+
l.Error("failed to parse study session delete form", "err", err)
htmx.HxError(w, http.StatusBadRequest, "Failed to delete study session, try again later.")
return
}
···
rkey := chi.URLParam(r, "rkey")
studySession, err := db.GetStudySessionByRkey(h.Db, user.Did, rkey)
if err != nil {
-
log.Println("failed to get study session from db:", err)
+
l.Error("failed to get study session from db", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to delete study session, try again later.")
return
}
if user.Did != studySession.Did {
-
log.Println("failed to delete study session: user does not own record")
+
l.Error("user does not own record", "did", user.Did, "sessionDid", studySession.Did)
htmx.HxError(w, http.StatusUnauthorized, "Failed to delete study session, try again later.")
return
}
···
Rkey: rkey,
})
if err != nil {
-
log.Println("failed to delete study session from PDS:", err)
+
l.Error("failed to delete study session from PDS", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to delete study session, try again later.")
return
}
err = SavePendingDelete(h, w, r, PendingStudySessionDeletion, studySession)
if err != nil {
-
log.Printf("failed to save yoten-session to add pending study session deletion: %v", err)
+
l.Error("failed to save yoten-session to add pending study session deletion", "err", err)
}
if !h.Config.Core.Dev {
···
Set("session_age_seconds", time.Since(studySession.CreatedAt).Seconds()),
})
if err != nil {
-
log.Println("failed to enqueue posthog event:", err)
+
l.Error("failed to enqueue posthog event", "err", err)
}
}
···
}
func (h *Handler) HandleStudySessionPage(w http.ResponseWriter, r *http.Request) {
+
l := h.Logger.With("handler", "HandleStudySessionPage")
+
user, _ := bsky.GetUserWithBskyProfile(h.Oauth, r)
didOrHandle := chi.URLParam(r, "user")
if didOrHandle == "" {
···
studySession, err := db.GetStudySessionByRkey(h.Db, ident.DID.String(), rkey)
if err != nil {
-
log.Println("failed to retrieve study session:", err)
+
l.Error("failed to retrieve study session", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to retrieve study session, try again later.")
return
}
bskyProfile, err := bsky.GetBskyProfile(ident.DID.String())
if err != nil {
-
log.Println("failed to retrieve bsky profile for study session:", err)
+
l.Error("failed to retrieve bsky profile for study session", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to retrieve bsky profile, try again later.")
return
}
profile, err := db.GetProfile(h.Db, ident.DID.String())
if err != nil {
-
log.Println("failed to retrieve profile for study session:", err)
+
l.Error("failed to retrieve profile for study session", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to retrieve profile, try again later.")
return
}
···
}
func (h *Handler) HandleStudySessionPageCommentFeed(w http.ResponseWriter, r *http.Request) {
+
l := h.Logger.With("handler", "HandleStudySessionPageCommentFeed")
+
user, _ := bsky.GetUserWithBskyProfile(h.Oauth, r)
didOrHandle := chi.URLParam(r, "user")
···
}
page, err := strconv.ParseInt(pageStr, 10, 64)
if err != nil {
-
log.Println("failed to parse page value:", err)
+
l.Error("failed to parse page value", "err", err)
page = 1
}
if page == 0 {
···
commentFeed, err := db.GetCommentsForSession(h.Db, studySessionUri.String(), pageSize+1, int(offset))
if err != nil {
-
log.Println("failed to get comment feed:", err)
+
l.Error("failed to get comment feed", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to get comment feed, try again later.")
return
}
···
populatedCommentFeed, err := h.BuildCommentFeed(finalFeed)
if err != nil {
-
log.Println("failed to populate comment feed:", err)
+
l.Error("failed to populate comment feed", "err", err)
htmx.HxError(w, http.StatusInternalServerError, "Failed to get comment feed, try again later.")
return
}