From a6d903dc567071353e5014bea4537a9b9c74a80d Mon Sep 17 00:00:00 2001 From: brookjeynes Date: Wed, 15 Oct 2025 11:50:39 +1000 Subject: [PATCH] feat(handlers/profile): use slogger Change-Id: rowvvuplwxlmvtvkskrqmrvmzmxopyps Signed-off-by: brookjeynes --- internal/server/handlers/profile.go | 96 +++++++++++++++++------------ 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/internal/server/handlers/profile.go b/internal/server/handlers/profile.go index 369b148..76f51ed 100644 --- a/internal/server/handlers/profile.go +++ b/internal/server/handlers/profile.go @@ -3,7 +3,7 @@ package handlers import ( "errors" "fmt" - "log" + "log/slog" "net/http" "strconv" "time" @@ -30,7 +30,7 @@ const ( PendingProfileUpdate string = "pending_profile_update" ) -func parseProfileForm(r *http.Request) (db.Profile, error) { +func parseProfileForm(r *http.Request, logger *slog.Logger) (db.Profile, error) { err := r.ParseForm() if err != nil { return db.Profile{}, fmt.Errorf("invalid profile form: %w", err) @@ -45,7 +45,7 @@ func parseProfileForm(r *http.Request) (db.Profile, error) { for _, code := range languageCodes { language, ok := db.Languages[db.LanguageCode(code)] if !ok { - log.Printf("invalid language code submitted: %s", code) + logger.Warn("invalid language code submitted", "languageCode", code) continue } languages = append(languages, language) @@ -62,6 +62,8 @@ func parseProfileForm(r *http.Request) (db.Profile, error) { } func (h *Handler) HandleProfilePage(w http.ResponseWriter, r *http.Request) { + l := h.Logger.With("handler", "HandleProfilePage") + didOrHandle := chi.URLParam(r, "user") if didOrHandle == "" { http.Error(w, "Bad request", http.StatusBadRequest) @@ -102,22 +104,22 @@ func (h *Handler) HandleProfilePage(w http.ResponseWriter, r *http.Request) { totalStudyTime, err = db.GetTotalStudyTime(h.Db, profileDid) if err != nil { - log.Println("failed to get total study time:", err) + l.Error("failed to get total study time", "err", err) } totalStudySessions, _ = db.GetTotalStudySessions(h.Db, profileDid) if err != nil { - log.Println("failed to get total study study sessions:", err) + l.Error("failed to get total study study sessions", "err", err) } followers, following, _ = db.GetFollowerFollowingCount(h.Db, profileDid) if err != nil { - log.Println("failed to get follow stats:", err) + l.Error("failed to get follow stats", "err", err) } streak, _ = db.GetCurrentStreak(h.Db, profileDid) if err != nil { - log.Println("failed to get streak:", err) + l.Error("failed to get streak", "err", err) } if user != nil { @@ -128,7 +130,7 @@ func (h *Handler) HandleProfilePage(w http.ResponseWriter, r *http.Request) { }) if err := g.Wait(); err != nil { - log.Printf("failed to fetch critical profile data for %s: %v", profileDid, err) + l.Error("failed to fetch critical profile data for", "did", profileDid, "err", err) htmx.HxError(w, http.StatusInternalServerError, "Failed to fetch profile data, try again later.") return } @@ -160,7 +162,7 @@ func (h *Handler) HandleProfilePage(w http.ResponseWriter, r *http.Request) { err := h.Posthog.Enqueue(capture) if err != nil { - log.Println("failed to enqueue posthog event:", err) + l.Error("failed to enqueue posthog event", "err", err) } } @@ -178,23 +180,25 @@ func (h *Handler) HandleProfilePage(w http.ResponseWriter, r *http.Request) { } func (h *Handler) HandleEditProfilePage(w http.ResponseWriter, r *http.Request) { + l := h.Logger.With("handler", "HandleEditProfilePage") + 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 } profile, err := h.GetUserProfileWithAvatar(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) w.WriteHeader(http.StatusNotFound) views.NotFoundPage(views.NotFoundPageParams{}).Render(r.Context(), w) return } if user.Did != profile.Did { - log.Printf("user '%s' does not own record '%s'", user.Did, profile.Did) + l.Error("user does not own record", "did", user.Did, "profileDid", profile.Did) htmx.HxError(w, http.StatusUnauthorized, "You do not have permissions to edit this profile.") return } @@ -214,14 +218,14 @@ func (h *Handler) HandleEditProfilePage(w http.ResponseWriter, r *http.Request) case http.MethodPost: 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 } - updatedProfile, err := parseProfileForm(r) + updatedProfile, err := parseProfileForm(r, l) if err != nil { - log.Println("invalid profile form:", err) + l.Error("invalid profile form", "err", err) htmx.HxError(w, http.StatusBadRequest, "Failed to update profile, ensure all fields contain valid data.") return } @@ -236,7 +240,7 @@ func (h *Handler) HandleEditProfilePage(w http.ResponseWriter, r *http.Request) } if err := db.ValidateProfile(updatedProfile); err != nil { - log.Println("invalid profile:", err) + l.Error("invalid profile", "err", err) switch { case errors.Is(err, db.ErrProfileNameTooLong): htmx.HxError(w, http.StatusBadRequest, "Profile name cannot be more than 64 characters.") @@ -280,14 +284,14 @@ func (h *Handler) HandleEditProfilePage(w http.ResponseWriter, r *http.Request) SwapRecord: cid, }) if err != nil { - log.Println("failed to put profile record:", err) + l.Error("failed to put profile record", "err", err) htmx.HxError(w, http.StatusInternalServerError, "Failed to update PDS, try again later.") return } err = SavePendingUpdate(h, w, r, PendingProfileUpdate, profile) if err != nil { - log.Printf("failed to save yoten-session to add pending profile update: %v", err) + l.Error("failed to save yoten-session to add pending profile update", "err", err) } if !h.Config.Core.Dev { @@ -308,7 +312,7 @@ func (h *Handler) HandleEditProfilePage(w http.ResponseWriter, r *http.Request) Properties: properties, }) if err != nil { - log.Println("failed to enqueue posthog identify event:", err) + l.Error("failed to enqueue posthog identify event", "err", err) } err = h.Posthog.Enqueue(posthog.Capture{ @@ -316,7 +320,7 @@ func (h *Handler) HandleEditProfilePage(w http.ResponseWriter, r *http.Request) Event: ph.ProfileRecordEditedEvent, }) if err != nil { - log.Println("failed to enqueue posthog event:", err) + l.Error("failed to enqueue posthog event", "err", err) } } @@ -325,23 +329,25 @@ func (h *Handler) HandleEditProfilePage(w http.ResponseWriter, r *http.Request) } func (h *Handler) HandleResourcesPage(w http.ResponseWriter, r *http.Request) { + l := h.Logger.With("handler", "HandleResourcesPage") + 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 } resources, err := db.GetResourcesByDid(h.Db, user.Did) if err != nil { - log.Println("failed to get resources:", err) + l.Error("failed to get resources", "err", err) htmx.HxError(w, http.StatusInternalServerError, "Failed to retrieve profile resources, try again later.") return } resources, err = ApplyPendingChanges(h, w, r, resources, PendingResourceCreation, PendingResourceUpdates, PendingResourceDeletion) 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) } activeResources := utils.Filter(resources, func(resource db.Resource) bool { @@ -355,23 +361,25 @@ func (h *Handler) HandleResourcesPage(w http.ResponseWriter, r *http.Request) { } func (h *Handler) HandleActivitiesPage(w http.ResponseWriter, r *http.Request) { + l := h.Logger.With("handler", "HandleActivitiesPage") + 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 } activities, err := db.GetActivitiesByDid(h.Db, user.Did) if err != nil { - log.Println("failed to get activities:", err) + l.Error("failed to get activities", "err", err) htmx.HxError(w, http.StatusInternalServerError, "Failed to retrieve profile activities, try again later.") return } activities, err = ApplyPendingChanges(h, w, r, activities, PendingActivityCreation, PendingActivityUpdates, PendingActivityDeletion) 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) } activeActivities := utils.Filter(activities, func(activity db.Activity) bool { @@ -400,6 +408,8 @@ func (h *Handler) GetUserProfileWithAvatar(did string) (db.Profile, error) { } func (h *Handler) HandleProfileFeed(w http.ResponseWriter, r *http.Request) { + l := h.Logger.With("handler", "HandleProfileFeed") + didOrHandle := chi.URLParam(r, "user") if didOrHandle == "" { http.Error(w, "Bad request", http.StatusBadRequest) @@ -415,7 +425,7 @@ func (h *Handler) HandleProfileFeed(w http.ResponseWriter, r *http.Request) { profile, err := h.GetUserProfileWithAvatar(ident.DID.String()) if err != nil { - log.Printf("failed to find %s in db: %s", ident.DID.String(), err) + l.Error("failed to find user in db", "did", ident.DID.String(), "err", err) w.WriteHeader(http.StatusNotFound) views.NotFoundPage(views.NotFoundPageParams{}).Render(r.Context(), w) return @@ -423,7 +433,7 @@ func (h *Handler) HandleProfileFeed(w http.ResponseWriter, r *http.Request) { bskyProfile, err := bsky.GetBskyProfile(ident.DID.String()) if err != nil { - log.Println("failed to get bsky profile:", err) + l.Error("failed to get bsky profile", "err", err) w.WriteHeader(http.StatusNotFound) views.NotFoundPage(views.NotFoundPageParams{}).Render(r.Context(), w) return @@ -435,7 +445,7 @@ func (h *Handler) HandleProfileFeed(w http.ResponseWriter, r *http.Request) { } 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 { @@ -447,7 +457,7 @@ func (h *Handler) HandleProfileFeed(w http.ResponseWriter, r *http.Request) { sessions, err := db.GetStudySessionLogs(h.Db, ident.DID.String(), pageSize+1, int(offset)) if err != nil { - log.Println("failed to get study sessions:", err) + l.Error("failed to get study sessions", "err", err) w.WriteHeader(http.StatusNotFound) views.NotFoundPage(views.NotFoundPageParams{}).Render(r.Context(), w) return @@ -455,7 +465,7 @@ func (h *Handler) HandleProfileFeed(w http.ResponseWriter, r *http.Request) { sessions, err = ApplyPendingChanges(h, w, r, sessions, 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) } feed := []*db.StudySessionFeedItem{} @@ -493,16 +503,18 @@ func (h *Handler) HandleProfileFeed(w http.ResponseWriter, r *http.Request) { } func (h *Handler) HandleFriendsPage(w http.ResponseWriter, r *http.Request) { + l := h.Logger.With("handler", "HandleFriendsPage") + 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 } followers, following, err := db.GetFollowerFollowingCount(h.Db, user.Did) if err != nil { - log.Printf("getting follow stats repos for %s: %s", user.Did, err) + l.Error("failed to get follow stats", "err", err) } views.FriendsPage(views.FriendsPageParams{ @@ -513,9 +525,11 @@ func (h *Handler) HandleFriendsPage(w http.ResponseWriter, r *http.Request) { } func (h *Handler) HandleFriendsFeed(w http.ResponseWriter, r *http.Request) { + l := h.Logger.With("handler", "HandleFriendsFeed") + user, err := bsky.GetUserWithBskyProfile(h.Oauth, r) if err != nil { - log.Println("failed to get logged-in user") + l.Error("failed to get logged-in user") htmx.HxRedirect(w, "/login") return } @@ -529,7 +543,7 @@ func (h *Handler) HandleFriendsFeed(w http.ResponseWriter, r *http.Request) { } 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 { @@ -545,26 +559,26 @@ func (h *Handler) HandleFriendsFeed(w http.ResponseWriter, r *http.Request) { if mode == partials.Following { feed, err := db.GetFollowing(h.Db, user.Did, pageSize+1, int(offset)) if err != nil { - log.Println("failed to get following list:", err) + l.Error("failed to get following list", "err", err) htmx.HxError(w, http.StatusInternalServerError, "Failed to get following list, try again later.") return } bskyHydratedFeed, err = h.GetHydratedFollowerProfiles(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 following list, try again later.") return } } else { feed, err := db.GetFollowers(h.Db, user.Did, pageSize+1, int(offset)) if err != nil { - log.Println("failed to get followers list:", err) + l.Error("failed to get followers list", "err", err) htmx.HxError(w, http.StatusInternalServerError, "Failed to get followers list, try again later.") return } bskyHydratedFeed, err = h.GetHydratedFollowerProfiles(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 following list, try again later.") return } @@ -586,9 +600,11 @@ func (h *Handler) HandleFriendsFeed(w http.ResponseWriter, r *http.Request) { } func (h *Handler) HandleNotificationsPage(w http.ResponseWriter, r *http.Request) { + l := h.Logger.With("handler", "HandleNotificationsPage") + 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 } -- 2.43.0