Noah
de9ba94dd9
* Add ability to unlock your private photos for others. * Link to unlock is on another user's Photos page. * You can also access your "Manage Private Photos" page in the User Menu or Dashboard and add a user by username. * See who you have granted access, and see users who have granted you access to their private photos. * Private photos of users who unlocked them for you may appear on the Site Gallery if the photo allows. * Add new filters to the Site Gallery: you can choose to filter by Explicit, limit to a specific Visibility, and order by Newest or Oldest. Non-explicit users do not get a filter to see explicit content - they must opt-in in their settings. * Bugfix: Site Gallery was not correctly filtering Explicit photos away from users who did not opt-in for explicit!
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(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
|
|
}
|
|
})
|
|
}
|