Noah
6c91c67c97
* Users who set their Profile Picture to "friends only" or "private" can have their avatar be private all over the website to users who are not their friends or not granted access. * Users who are not your friends see a yellow placeholder avatar, and users not granted access to a private Profile Pic sees a purple avatar. * Admin users see these same placeholder avatars most places too (on search, forums, comments, etc.) if the user did not friend or grant the admin. But admins ALWAYS see it on their Profile Page directly, for ability to moderate. * Fix marking Notifications as read: clicking the link in an unread notification now will wait on the ajax request to finish before allowing the redirect. * Update the FAQ
104 lines
2.5 KiB
Go
104 lines
2.5 KiB
Go
package photo
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"code.nonshy.com/nonshy/website/pkg/config"
|
|
"code.nonshy.com/nonshy/website/pkg/models"
|
|
"code.nonshy.com/nonshy/website/pkg/session"
|
|
"code.nonshy.com/nonshy/website/pkg/templates"
|
|
)
|
|
|
|
// SiteGallery controller (/photo/gallery) to view all members' public gallery pics.
|
|
func SiteGallery() http.HandlerFunc {
|
|
tmpl := templates.Must("photo/gallery.html")
|
|
|
|
// Whitelist for ordering options.
|
|
var sortWhitelist = []string{
|
|
"created_at desc",
|
|
"created_at asc",
|
|
}
|
|
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
// Query params.
|
|
var (
|
|
viewStyle = r.FormValue("view") // cards (default), full
|
|
|
|
// Search filters.
|
|
filterExplicit = r.FormValue("explicit")
|
|
filterVisibility = r.FormValue("visibility")
|
|
sort = r.FormValue("sort")
|
|
sortOK bool
|
|
)
|
|
|
|
// Sort options.
|
|
for _, v := range sortWhitelist {
|
|
if sort == v {
|
|
sortOK = true
|
|
break
|
|
}
|
|
}
|
|
if !sortOK {
|
|
sort = "created_at desc"
|
|
}
|
|
|
|
// Defaults.
|
|
if viewStyle != "full" {
|
|
viewStyle = "cards"
|
|
}
|
|
|
|
// Load the current user.
|
|
currentUser, err := session.CurrentUser(r)
|
|
if err != nil {
|
|
session.FlashError(w, r, "Unexpected error: couldn't get CurrentUser")
|
|
}
|
|
|
|
// Get the page of photos.
|
|
pager := &models.Pagination{
|
|
Page: 1,
|
|
PerPage: config.PageSizeSiteGallery,
|
|
Sort: sort,
|
|
}
|
|
pager.ParsePage(r)
|
|
photos, err := models.PaginateGalleryPhotos(currentUser, filterExplicit, filterVisibility, pager)
|
|
|
|
// Bulk load the users associated with these photos.
|
|
var userIDs = []uint64{}
|
|
for _, photo := range photos {
|
|
userIDs = append(userIDs, photo.UserID)
|
|
}
|
|
userMap, err := models.MapUsers(currentUser, userIDs)
|
|
if err != nil {
|
|
session.FlashError(w, r, "Failed to MapUsers: %s", err)
|
|
}
|
|
|
|
// Get Likes information about these photos.
|
|
var photoIDs = []uint64{}
|
|
for _, p := range photos {
|
|
photoIDs = append(photoIDs, p.ID)
|
|
}
|
|
likeMap := models.MapLikes(currentUser, "photos", photoIDs)
|
|
commentMap := models.MapCommentCounts("photos", photoIDs)
|
|
|
|
var vars = map[string]interface{}{
|
|
"IsSiteGallery": true,
|
|
"Photos": photos,
|
|
"UserMap": userMap,
|
|
"LikeMap": likeMap,
|
|
"CommentMap": commentMap,
|
|
"Pager": pager,
|
|
"ViewStyle": viewStyle,
|
|
|
|
// Search filters
|
|
"Sort": sort,
|
|
"FilterExplicit": filterExplicit,
|
|
"FilterVisibility": filterVisibility,
|
|
}
|
|
|
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
})
|
|
}
|