Fix site gallery userID + visibility filters
This commit is contained in:
parent
898be65327
commit
64d2749299
|
@ -60,7 +60,7 @@ func SiteGallery() http.HandlerFunc {
|
|||
if viewStyle != "full" {
|
||||
viewStyle = "cards"
|
||||
}
|
||||
if who != "friends" && who != "everybody" {
|
||||
if who != "friends" && who != "everybody" && who != "friends+private" {
|
||||
// Default Who setting should be Friends-only, unless you have no friends.
|
||||
if myFriendCount > 0 {
|
||||
who = "friends"
|
||||
|
@ -85,7 +85,8 @@ func SiteGallery() http.HandlerFunc {
|
|||
Explicit: filterExplicit,
|
||||
Visibility: filterVisibility,
|
||||
AdminView: adminView,
|
||||
FriendsOnly: isShy || who == "friends",
|
||||
FriendsOnly: who == "friends",
|
||||
IsShy: isShy || who == "friends+private",
|
||||
}, pager)
|
||||
|
||||
// Bulk load the users associated with these photos.
|
||||
|
|
|
@ -2,6 +2,7 @@ package models
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
|
@ -399,6 +400,7 @@ type Gallery struct {
|
|||
Explicit string // Explicit filter
|
||||
Visibility string // Visibility filter
|
||||
AdminView bool // Show all images
|
||||
IsShy bool // Current user is like a Shy Account (or: show self/friends and private photo grants only)
|
||||
FriendsOnly bool // Only show self/friends instead of everybody's pics
|
||||
}
|
||||
|
||||
|
@ -412,7 +414,8 @@ func PaginateGalleryPhotos(user *User, conf Gallery, pager *Pagination) ([]*Phot
|
|||
filterExplicit = conf.Explicit
|
||||
filterVisibility = conf.Visibility
|
||||
adminView = conf.AdminView
|
||||
friendsOnly = conf.FriendsOnly
|
||||
friendsOnly = conf.FriendsOnly // Show only self and friends pictures
|
||||
isShy = conf.IsShy // Self, friends, and private photo grants only
|
||||
p = []*Photo{}
|
||||
query *gorm.DB
|
||||
|
||||
|
@ -420,16 +423,16 @@ func PaginateGalleryPhotos(user *User, conf Gallery, pager *Pagination) ([]*Phot
|
|||
userID = user.ID
|
||||
explicitOK = user.Explicit // User opted-in for explicit content
|
||||
|
||||
blocklist = BlockedUserIDs(user)
|
||||
friendIDs = FriendIDs(userID)
|
||||
privateUserIDs = PrivateGrantedUserIDs(userID)
|
||||
wheres = []string{}
|
||||
placeholders = []interface{}{}
|
||||
blocklist = BlockedUserIDs(user)
|
||||
friendIDs = FriendIDs(userID)
|
||||
privateUserIDs = PrivateGrantedUserIDs(userID)
|
||||
privateUserIDsAreFriends = PrivateGrantedUserIDsAreFriends(user)
|
||||
wheres = []string{}
|
||||
placeholders = []interface{}{}
|
||||
)
|
||||
|
||||
// Define "all photos visibilities"
|
||||
var (
|
||||
photosAll = PhotoVisibilityAll
|
||||
photosPublic = []PhotoVisibility{
|
||||
PhotoPublic,
|
||||
}
|
||||
|
@ -437,9 +440,11 @@ func PaginateGalleryPhotos(user *User, conf Gallery, pager *Pagination) ([]*Phot
|
|||
PhotoPublic,
|
||||
PhotoFriends,
|
||||
}
|
||||
photosPrivate = []PhotoVisibility{
|
||||
PhotoPrivate,
|
||||
}
|
||||
)
|
||||
if user.IsInnerCircle() {
|
||||
photosAll = PhotoVisibilityCircle
|
||||
photosPublic = append(photosPublic, PhotoInnerCircle)
|
||||
photosFriends = append(photosFriends, PhotoInnerCircle)
|
||||
}
|
||||
|
@ -450,32 +455,52 @@ func PaginateGalleryPhotos(user *User, conf Gallery, pager *Pagination) ([]*Phot
|
|||
// Include ourself in our friend IDs.
|
||||
friendIDs = append(friendIDs, userID)
|
||||
|
||||
// What sets of User ID * Visibility filters to query under?
|
||||
var (
|
||||
visOrs = []string{}
|
||||
visPlaceholders = []interface{}{}
|
||||
)
|
||||
|
||||
// Whose photos can you see on the Site Gallery?
|
||||
if friendsOnly {
|
||||
if isShy {
|
||||
// Shy users can only see their Friends photos (public or friends visibility)
|
||||
// and any Private photos to whom they were granted access.
|
||||
wheres = append(wheres,
|
||||
"((user_id IN ? AND visibility IN ?) OR "+
|
||||
"(user_id IN ? AND visibility IN ?))",
|
||||
visOrs = append(visOrs,
|
||||
"(user_id IN ? AND visibility IN ?)",
|
||||
"(user_id IN ? AND visibility IN ?)",
|
||||
)
|
||||
placeholders = append(placeholders,
|
||||
friendIDs, PhotoVisibilityFriends,
|
||||
privateUserIDs, photosAll,
|
||||
visPlaceholders = append(visPlaceholders,
|
||||
friendIDs, photosFriends,
|
||||
privateUserIDs, photosPrivate,
|
||||
)
|
||||
} else if friendsOnly {
|
||||
// User wants to see only self and friends photos.
|
||||
visOrs = append(visOrs, "(user_id IN ? AND visibility IN ?)")
|
||||
visPlaceholders = append(visPlaceholders, friendIDs, photosFriends)
|
||||
|
||||
// If their friends granted private photos, include those too.
|
||||
if len(privateUserIDsAreFriends) > 0 {
|
||||
visOrs = append(visOrs, "(user_id IN ? AND visibility IN ?)")
|
||||
visPlaceholders = append(visPlaceholders, privateUserIDsAreFriends, photosPrivate)
|
||||
}
|
||||
} else {
|
||||
// You can see friends' Friend photos but only public for non-friends.
|
||||
wheres = append(wheres,
|
||||
"((user_id IN ? AND visibility IN ?) OR "+
|
||||
"(user_id IN ? AND visibility IN ?) OR "+
|
||||
"(user_id NOT IN ? AND visibility IN ?))",
|
||||
visOrs = append(visOrs,
|
||||
"(user_id IN ? AND visibility IN ?)",
|
||||
"(user_id IN ? AND visibility IN ?)",
|
||||
"(user_id NOT IN ? AND visibility IN ?)",
|
||||
)
|
||||
placeholders = append(placeholders,
|
||||
visPlaceholders = append(placeholders,
|
||||
friendIDs, photosFriends,
|
||||
privateUserIDs, photosAll,
|
||||
privateUserIDs, photosPrivate,
|
||||
friendIDs, photosPublic,
|
||||
)
|
||||
}
|
||||
|
||||
// Join the User ID * Visibility filters into a nested "OR"
|
||||
wheres = append(wheres, fmt.Sprintf("(%s)", strings.Join(visOrs, " OR ")))
|
||||
placeholders = append(placeholders, visPlaceholders...)
|
||||
|
||||
// Gallery photos only.
|
||||
wheres = append(wheres, "gallery = ?")
|
||||
placeholders = append(placeholders, true)
|
||||
|
|
|
@ -158,6 +158,23 @@ func PrivateGrantedUserIDs(userId uint64) []uint64 {
|
|||
return userIDs
|
||||
}
|
||||
|
||||
// PrivateGrantedUserIDsAreFriends returns user IDs who have granted us their private pictures, and are also our friends.
|
||||
func PrivateGrantedUserIDsAreFriends(currentUser *User) []uint64 {
|
||||
var (
|
||||
ps = []*PrivatePhoto{}
|
||||
userIDs = []uint64{}
|
||||
)
|
||||
DB.Model(&PrivatePhoto{}).Joins(
|
||||
"JOIN friends ON friends.source_user_id = private_photos.source_user_id AND friends.target_user_id = private_photos.target_user_id",
|
||||
).Where(
|
||||
"private_photos.target_user_id = ? AND friends.approved IS true", currentUser.ID,
|
||||
).Find(&ps)
|
||||
for _, row := range ps {
|
||||
userIDs = append(userIDs, row.SourceUserID)
|
||||
}
|
||||
return userIDs
|
||||
}
|
||||
|
||||
// PrivateGranteeUserIDs are the users whom WE have granted access to our photos (userId is the photo owners).
|
||||
func PrivateGranteeUserIDs(userId uint64) []uint64 {
|
||||
var (
|
||||
|
|
|
@ -226,9 +226,15 @@
|
|||
<!-- Indicator if friends-only is selected. -->
|
||||
{{if eq .FilterWho "friends"}}
|
||||
<div class="notification is-success is-light">
|
||||
Showing you all recent photos from <strong>your friends.</strong>
|
||||
Showing you all recent photos from <strong>yourself & your friends.</strong>
|
||||
<a href="{{.Request.URL.Path}}?who=everybody">See all certified members' gallery photos?</a>
|
||||
</div>
|
||||
{{else if eq .FilterWho "friends+private"}}
|
||||
<div class="notification is-success is-light">
|
||||
Showing you all recent photos from <strong>yourself & your friends</strong> as well
|
||||
as any <strong>private photos shared with you</strong> by others on the site (if they are
|
||||
marked to appear in the Site Gallery).
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<!-- Filters -->
|
||||
|
@ -256,7 +262,8 @@
|
|||
<label class="label" for="who">Whose photos:</label>
|
||||
<div class="select is-fullwidth">
|
||||
<select id="who" name="who">
|
||||
<option value="friends"{{if eq .FilterWho "friends"}} selected{{end}}>My friends only</option>
|
||||
<option value="friends"{{if eq .FilterWho "friends"}} selected{{end}}>Myself & friends only</option>
|
||||
<option value="friends+private"{{if eq .FilterWho "friends+private"}} selected{{end}}>Myself, friends, & private photo grants</option>
|
||||
<option value="everybody"{{if eq .FilterWho "everybody"}} selected{{end}}>All certified members</option>
|
||||
</select>
|
||||
</div>
|
||||
|
|
Loading…
Reference in New Issue
Block a user