package account import ( "net/http" "code.nonshy.com/nonshy/website/pkg/config" "code.nonshy.com/nonshy/website/pkg/log" "code.nonshy.com/nonshy/website/pkg/models" "code.nonshy.com/nonshy/website/pkg/session" "code.nonshy.com/nonshy/website/pkg/templates" ) // User dashboard or landing page (/me). func Dashboard() http.HandlerFunc { tmpl := templates.Must("account/dashboard.html") return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { currentUser, err := session.CurrentUser(r) if err != nil { http.Error(w, "Couldn't get currentUser", http.StatusInternalServerError) return } // Mark all notifications read? if r.Method == http.MethodPost { switch r.FormValue("intent") { case "read-notifications": if err := models.MarkNotificationsRead(currentUser); err != nil { session.FlashError(w, r, "Error marking your notifications as read: %s", err) } else { session.Flash(w, r, "All of your notifications have been marked as 'read!'") } case "clear-all": if err := models.ClearAllNotifications(currentUser); err != nil { session.FlashError(w, r, "Error clearing your notifications: %s", err) } else { session.Flash(w, r, "All of your notifications have been cleared!") } default: session.FlashError(w, r, "Unknown intent.") } templates.Redirect(w, r.URL.Path) return } // Parse notification filters. nf := models.NewNotificationFilterFromForm(r) // Get our notifications. pager := &models.Pagination{ Page: 1, PerPage: config.PageSizeDashboardNotifications, Sort: "read, created_at desc", } pager.ParsePage(r) notifs, err := models.PaginateNotifications(currentUser, nf, pager) if err != nil { session.FlashError(w, r, "Couldn't get your notifications: %s", err) } // Map our notifications. notifMap := models.MapNotifications(notifs) models.SetUserRelationshipsInNotifications(currentUser, notifs) // Map likes for in-line like buttons on (other peoples) photos. // NOTE: comments can be trickier since the Notification.table_name='photos' if the comment is on a photo, // hard to create a LikesMap for the specific comment ID. var photoIDs = []uint64{} for _, notif := range notifs { if notif.TableName == "photos" { photoIDs = append(photoIDs, notif.TableID) } } // Restricted profile warnings. var ( isShyUser = currentUser.IsShy() photoTypes = currentUser.DistinctPhotoTypes() _, hasPublic = photoTypes[models.PhotoPublic] ) // Geolocation/Who's Nearby: if the current user uses GeoIP, update // their coordinates now. myLocation, err := models.RefreshGeoIP(currentUser.ID, r) if err != nil { log.Error("RefreshGeoIP: %s", err) } var vars = map[string]interface{}{ "Notifications": notifs, "NotifMap": notifMap, "Filters": nf, "Pager": pager, // Show a warning to 'restricted' profiles who are especially private. "IsShyUser": isShyUser, "HasPublicPhoto": hasPublic, "PhotoLikeMap": models.MapLikes(currentUser, "photos", photoIDs), // Who's Nearby stats. "MyLocation": myLocation, // Check 2FA enabled status for new feature announcement. "TwoFactorEnabled": models.Get2FA(currentUser.ID).Enabled, } if err := tmpl.Execute(w, r, vars); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } }) }