From 7ceb14053bad556c987c34b65ab34a19eb926653 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Wed, 14 Feb 2024 20:25:24 -0800 Subject: [PATCH] Don't show banned friends on friend page --- pkg/models/friend.go | 106 +++++++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 30 deletions(-) diff --git a/pkg/models/friend.go b/pkg/models/friend.go index 40e0d53..e5341e5 100644 --- a/pkg/models/friend.go +++ b/pkg/models/friend.go @@ -6,7 +6,6 @@ import ( "time" "code.nonshy.com/nonshy/website/pkg/log" - "gorm.io/gorm" ) // Friend table. @@ -249,11 +248,19 @@ func FriendIDsInCircleAreExplicit(userId uint64) []uint64 { // CountFriendRequests gets a count of pending requests for the user. func CountFriendRequests(userID uint64) (int64, error) { - var count int64 + var ( + count int64 + wheres = []string{ + "target_user_id = ? AND approved = ? AND ignored IS NOT true", + "EXISTS (SELECT 1 FROM users WHERE users.id = source_user_id AND users.status = 'active')", + } + placeholders = []interface{}{ + userID, false, + } + ) result := DB.Where( - "target_user_id = ? AND approved = ? AND ignored IS NOT true", - userID, - false, + strings.Join(wheres, " AND "), + placeholders..., ).Model(&Friend{}).Count(&count) return count, result.Error } @@ -262,7 +269,7 @@ func CountFriendRequests(userID uint64) (int64, error) { func CountIgnoredFriendRequests(userID uint64) (int64, error) { var count int64 result := DB.Where( - "target_user_id = ? AND approved = ? AND ignored = ?", + "target_user_id = ? AND approved = ? AND ignored = ? AND EXISTS (SELECT 1 FROM users WHERE users.id = friends.source_user_id AND users.status = 'active')", userID, false, true, @@ -295,38 +302,77 @@ have sent and have not been answered. func PaginateFriends(user *User, requests bool, sent bool, ignored bool, pager *Pagination) ([]*User, error) { // We paginate over the Friend table. var ( - fs = []*Friend{} - userIDs = []uint64{} - query *gorm.DB + fs = []*Friend{} + userIDs = []uint64{} + blockedUserIDs = BlockedUserIDs(user) + wheres = []string{} + placeholders = []interface{}{} + query = DB.Model(&Friend{}) ) if requests && sent && ignored { return nil, errors.New("requests and sent are mutually exclusive options, use one or neither") } - if requests { - query = DB.Where( - "target_user_id = ? AND approved = ? AND ignored IS NOT true", - user.ID, false, - ) - } else if sent { - query = DB.Where( - "source_user_id = ? AND approved = ? AND ignored IS NOT true", - user.ID, false, - ) - } else if ignored { - query = DB.Where( - "target_user_id = ? AND approved = ? AND ignored = ?", - user.ID, false, true, - ) - } else { - query = DB.Where( - "source_user_id = ? AND approved = ?", - user.ID, true, - ) + // Don't show our blocked users in the result. + if len(blockedUserIDs) > 0 { + wheres = append(wheres, "target_user_id NOT IN ?") + placeholders = append(placeholders, blockedUserIDs) } - query = query.Order(pager.Sort) + // Don't show disabled or banned users. + var ( + // Source user is banned (Requests, Ignored tabs) + bannedWhereRequest = ` + EXISTS ( + SELECT 1 + FROM users + WHERE users.id = friends.source_user_id + AND users.status = 'active' + ) + ` + + // Target user is banned (Friends, Sent tabs) + bannedWhereFriend = ` + EXISTS ( + SELECT 1 + FROM users + WHERE users.id = friends.target_user_id + AND users.status = 'active' + ) + ` + ) + + if requests { + wheres = append(wheres, "target_user_id = ? AND approved = ? AND ignored IS NOT true") + placeholders = append(placeholders, user.ID, false) + + // Don't show friend requests from currently banned/disabled users. + wheres = append(wheres, bannedWhereRequest) + } else if sent { + wheres = append(wheres, "source_user_id = ? AND approved = ? AND ignored IS NOT true") + placeholders = append(placeholders, user.ID, false) + + // Don't show friends who are currently banned/disabled. + wheres = append(wheres, bannedWhereFriend) + } else if ignored { + wheres = append(wheres, "target_user_id = ? AND approved = ? AND ignored = ?") + placeholders = append(placeholders, user.ID, false, true) + + // Don't show friend requests from currently banned/disabled users. + wheres = append(wheres, bannedWhereRequest) + } else { + wheres = append(wheres, "source_user_id = ? AND approved = ?") + placeholders = append(placeholders, user.ID, true) + + // Don't show friends who are currently banned/disabled. + wheres = append(wheres, bannedWhereFriend) + } + + query = query.Where( + strings.Join(wheres, " AND "), + placeholders..., + ).Order(pager.Sort) query.Model(&Friend{}).Count(&pager.Total) result := query.Offset(pager.GetOffset()).Limit(pager.PerPage).Find(&fs) if result.Error != nil {