From 61011efd9fc9180bf33374606c8f3572f22e702a Mon Sep 17 00:00:00 2001
From: Noah Petherbridge
Date: Sun, 23 Jul 2023 15:02:41 -0700
Subject: [PATCH] Photo counts on member directory + inner circle removal
privacy fix
---
pkg/controller/account/search.go | 3 ++
pkg/models/photo.go | 46 +++++++++++++++++++++++++++++++
pkg/models/user_inner_circle.go | 2 +-
web/templates/account/search.html | 14 +++++++---
4 files changed, 60 insertions(+), 5 deletions(-)
diff --git a/pkg/controller/account/search.go b/pkg/controller/account/search.go
index b0fcf85..cc52a56 100644
--- a/pkg/controller/account/search.go
+++ b/pkg/controller/account/search.go
@@ -100,6 +100,9 @@ func Search() http.HandlerFunc {
"AgeMin": ageMin,
"AgeMax": ageMax,
"Sort": sort,
+
+ // Photo counts mapped to users
+ "PhotoCountMap": models.MapPhotoCounts(users),
}
if err := tmpl.Execute(w, r, vars); err != nil {
diff --git a/pkg/models/photo.go b/pkg/models/photo.go
index ebecf73..f98bc61 100644
--- a/pkg/models/photo.go
+++ b/pkg/models/photo.go
@@ -145,6 +145,52 @@ func CountPhotos(userID uint64) int64 {
return count
}
+// MapPhotoCounts returns a mapping of user ID to the CountPhotos()-equivalent result for each.
+// It's used on the member directory to show photo counts on each user card.
+func MapPhotoCounts(users []*User) PhotoCountMap {
+ var (
+ userIDs = []uint64{}
+ result = PhotoCountMap{}
+ )
+
+ for _, user := range users {
+ userIDs = append(userIDs, user.ID)
+ }
+
+ type group struct {
+ UserID uint64
+ PhotoCount int64
+ }
+ var groups = []group{}
+
+ if res := DB.Table(
+ "photos",
+ ).Select(
+ "user_id, count(id) AS photo_count",
+ ).Where(
+ "user_id IN ?", userIDs,
+ ).Group("user_id").Scan(&groups); res.Error != nil {
+ log.Error("CountPhotosForUsers: %s", res.Error)
+ }
+
+ // Map the results in.
+ for _, row := range groups {
+ result[row.UserID] = row.PhotoCount
+ }
+
+ return result
+}
+
+type PhotoCountMap map[uint64]int64
+
+// Get a photo count for the given user ID from the map.
+func (pc PhotoCountMap) Get(id uint64) int64 {
+ if value, ok := pc[id]; ok {
+ return value
+ }
+ return 0
+}
+
// CountExplicitPhotos returns the number of explicit photos a user has (so non-explicit viewers can see some do exist)
func CountExplicitPhotos(userID uint64, visibility []PhotoVisibility) (int64, error) {
query := DB.Where(
diff --git a/pkg/models/user_inner_circle.go b/pkg/models/user_inner_circle.go
index bac7403..9c17318 100644
--- a/pkg/models/user_inner_circle.go
+++ b/pkg/models/user_inner_circle.go
@@ -56,7 +56,7 @@ func RemoveFromInnerCircle(u *User) error {
if err := DB.Model(&Photo{}).Where(
"user_id = ? AND visibility = ?",
u.ID, PhotoInnerCircle,
- ).Update("visibility", PhotoPublic); err != nil {
+ ).Update("visibility", PhotoFriends); err != nil {
log.Error("RemoveFromInnerCircle: couldn't update photo visibility: %s", err)
}
diff --git a/web/templates/account/search.html b/web/templates/account/search.html
index 4b2de64..99d0feb 100644
--- a/web/templates/account/search.html
+++ b/web/templates/account/search.html
@@ -194,8 +194,8 @@
{{.Username}}
{{if not .Certified}}
-
-
+
+
Not Certified!
{{end}}
@@ -204,11 +204,17 @@
{{if ne .Status "active"}}({{.Status}}){{end}}
{{if .IsAdmin}}
-
-
+
+
Admin
{{end}}
+
+
+
+
+ {{$Root.PhotoCountMap.Get .ID}}
+
{{if .GetProfileField "city"}}