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