fix: align IM client interaction edge cases

This commit is contained in:
richjohnrambo
2026-09-13 10:06:52 +08:00
parent e5fbca735d
commit d107fba8bf
5 changed files with 137 additions and 21 deletions
+8 -3
View File
@@ -3432,9 +3432,13 @@ func (a *adapter) TopicsForUser(uid t.Uid, keepDeleted bool, opts *t.QueryOpt) (
if len(usrq) > 0 {
q = `SELECT u.id,u.updatedat,u.state,u.access,u.lastseen,u.useragent,u.public,u.trusted,
p.nickname AS profile_nickname,p.avatar_file_id AS profile_avatar_file_id,p.signature AS profile_signature,
p.gender AS profile_gender,p.region AS profile_region,p.public_account AS profile_public_account,p.updated_at AS profile_updated_at
FROM im_users AS u LEFT JOIN im_user_profiles AS p ON p.user_id=u.id WHERE u.id IN (?)`
q, args, _ = sqlx.In(q, usrq)
p.gender AS profile_gender,p.region AS profile_region,p.public_account AS profile_public_account,p.updated_at AS profile_updated_at,
fs.remark AS friendship_remark
FROM im_users AS u
LEFT JOIN im_user_profiles AS p ON p.user_id=u.id
LEFT JOIN im_friendships AS fs ON fs.user_id=? AND fs.peer_id=u.id AND fs.status=?
WHERE u.id IN (?)`
q, args, _ = sqlx.In(q, store.DecodeUid(uid), t.RelationshipFriend, usrq)
if !keepDeleted {
// Optionally skip deleted users.
q += " AND u.state!=?"
@@ -3466,6 +3470,7 @@ func (a *adapter) TopicsForUser(uid t.Uid, keepDeleted bool, opts *t.QueryOpt) (
sub.SetTrusted(common.FromJSON(usr2.Trusted))
sub.SetDefaultAccess(usr2.Access.Auth, usr2.Access.Anon)
sub.SetLastSeenAndUA(usr2.lastSeen(), usr2.UserAgent)
sub.Private = ensureP2PPrivatePeerRemark(sub.Private, common.EncodeUidString(usr2.ID).UserId(), usr2.FriendshipRemark.String)
join[joinOn] = sub
p2pResolved[joinOn] = true
}
+16 -3
View File
@@ -68,6 +68,7 @@ type profileUserRow struct {
ProfileRegion sql.NullString `db:"profile_region"`
ProfilePublicAccount sql.NullString `db:"profile_public_account"`
ProfileUpdatedAt sql.NullTime `db:"profile_updated_at"`
FriendshipRemark sql.NullString `db:"friendship_remark"`
}
func (row profileUserRow) effectiveUpdatedAt() time.Time {
@@ -151,6 +152,10 @@ func profilePublicFromFields(base any, nickname, avatarFileID, signature, gender
}
func ensureP2PPrivatePeer(private any, peerID string) any {
return ensureP2PPrivatePeerRemark(private, peerID, "")
}
func ensureP2PPrivatePeerRemark(private any, peerID, remark string) any {
if strings.TrimSpace(peerID) == "" {
return private
}
@@ -161,6 +166,9 @@ func ensureP2PPrivatePeer(private any, peerID string) any {
if _, ok := data["peer"]; !ok {
data["peer"] = peerID
}
if remark = strings.TrimSpace(remark); remark != "" {
data["remark"] = remark
}
return data
}
@@ -1050,9 +1058,13 @@ func (a *adapter) TenantTopicsForUser(id t.TenantID, uid t.Uid, keepDeleted bool
if len(usrq) > 0 {
q = `SELECT u.tenant_id,u.id,u.updatedat,u.state,u.access,u.lastseen,u.useragent,u.public,u.trusted,
p.nickname AS profile_nickname,p.avatar_file_id AS profile_avatar_file_id,p.signature AS profile_signature,
p.gender AS profile_gender,p.region AS profile_region,p.public_account AS profile_public_account,p.updated_at AS profile_updated_at
FROM im_users AS u LEFT JOIN im_user_profiles AS p ON p.user_id=u.id WHERE u.tenant_id=? AND u.id IN (?)`
q, args, _ = sqlx.In(q, id, usrq)
p.gender AS profile_gender,p.region AS profile_region,p.public_account AS profile_public_account,p.updated_at AS profile_updated_at,
fs.remark AS friendship_remark
FROM im_users AS u
LEFT JOIN im_user_profiles AS p ON p.user_id=u.id
LEFT JOIN im_friendships AS fs ON fs.user_id=? AND fs.peer_id=u.id AND fs.status=?
WHERE u.tenant_id=? AND u.id IN (?)`
q, args, _ = sqlx.In(q, decodeUID(uid), t.RelationshipFriend, id, usrq)
if !keepDeleted {
q += " AND u.state!=?"
args = append(args, t.StateDeleted)
@@ -1075,6 +1087,7 @@ func (a *adapter) TenantTopicsForUser(id t.TenantID, uid t.Uid, keepDeleted bool
sub.SetTrusted(common.FromJSON(user.Trusted))
sub.SetDefaultAccess(user.Access.Auth, user.Access.Anon)
sub.SetLastSeenAndUA(user.lastSeen(), user.UserAgent)
sub.Private = ensureP2PPrivatePeerRemark(sub.Private, common.EncodeUidString(user.ID).UserId(), user.FriendshipRemark.String)
join[joinOn] = sub
p2pResolved[joinOn] = true
}