Fix friends display name fallback
This commit is contained in:
@@ -84,22 +84,16 @@ func profilePublicFromFields(base any, nickname, avatarFileID sql.NullString) an
|
|||||||
public := publicMap(base)
|
public := publicMap(base)
|
||||||
if nickname.Valid {
|
if nickname.Valid {
|
||||||
value := strings.TrimSpace(nickname.String)
|
value := strings.TrimSpace(nickname.String)
|
||||||
for _, key := range []string{"display_name", "nickname", "fn", "name"} {
|
if value != "" {
|
||||||
if value == "" {
|
for _, key := range []string{"display_name", "nickname", "fn", "name"} {
|
||||||
delete(public, key)
|
|
||||||
} else {
|
|
||||||
public[key] = value
|
public[key] = value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if avatarFileID.Valid {
|
if avatarFileID.Valid {
|
||||||
value := strings.TrimSpace(avatarFileID.String)
|
value := strings.TrimSpace(avatarFileID.String)
|
||||||
for _, key := range []string{"avatar_file_id", "photo", "avatar"} {
|
if value != "" {
|
||||||
if value == "" {
|
public["avatar_file_id"] = value
|
||||||
delete(public, key)
|
|
||||||
} else if key == "avatar_file_id" {
|
|
||||||
public[key] = value
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return public
|
return public
|
||||||
|
|||||||
@@ -47,13 +47,12 @@ func TestProfilePublicFromFields(t *testing.T) {
|
|||||||
t.Fatalf("profile public not overlaid: %#v", public)
|
t.Fatalf("profile public not overlaid: %#v", public)
|
||||||
}
|
}
|
||||||
|
|
||||||
public = profilePublicFromFields(public, sql.NullString{Valid: true}, sql.NullString{Valid: true}).(map[string]any)
|
public = profilePublicFromFields(map[string]any{
|
||||||
for _, key := range []string{"fn", "name", "nickname", "display_name", "avatar_file_id", "photo", "avatar"} {
|
"fn": "旧昵称",
|
||||||
if _, ok := public[key]; ok {
|
"avatar_file_id": "old_avatar",
|
||||||
t.Fatalf("field %s should be hidden by empty profile value: %#v", key, public)
|
"public_account": "usrAccount",
|
||||||
}
|
}, sql.NullString{Valid: true}, sql.NullString{Valid: true}).(map[string]any)
|
||||||
}
|
if public["fn"] != "旧昵称" || public["avatar_file_id"] != "old_avatar" || public["public_account"] != "usrAccount" {
|
||||||
if public["public_account"] != "usrAccount" {
|
t.Fatalf("empty profile fields should keep existing public values: %#v", public)
|
||||||
t.Fatalf("unrelated public field changed: %#v", public)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8539,6 +8539,9 @@ func friendListItemPayload(item types.FriendListItem) map[string]any {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if item.Friendship.Remark == "" && data["display_name"] == data["user_id"] {
|
||||||
|
data["display_name_source"] = "user_id"
|
||||||
|
}
|
||||||
data["initial"] = displayInitial(data["display_name"])
|
data["initial"] = displayInitial(data["display_name"])
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|||||||
+58
-1
@@ -6274,11 +6274,68 @@ func TestServeIMFriendsList(t *testing.T) {
|
|||||||
}
|
}
|
||||||
data := decodeIMHTTPResponse(t, rec).Data.(map[string]any)
|
data := decodeIMHTTPResponse(t, rec).Data.(map[string]any)
|
||||||
items := data["items"].([]any)
|
items := data["items"].([]any)
|
||||||
if len(items) != 1 || items[0].(map[string]any)["display_name"] != "小明" {
|
if len(items) != 1 || items[0].(map[string]any)["display_name"] != "小明" || items[0].(map[string]any)["display_name_source"] != "remark" {
|
||||||
t.Fatalf("unexpected friends list: %#v", data)
|
t.Fatalf("unexpected friends list: %#v", data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestServeIMFriendsListUsesUserIDSourceOnlyForFallback(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
defer ctrl.Finish()
|
||||||
|
expectIMBearer(t, ctrl, "token-1", 7, 1)
|
||||||
|
oldRelations := store.Relations
|
||||||
|
now := time.Now().UTC().Round(time.Millisecond)
|
||||||
|
namedPeer := types.Uid(2)
|
||||||
|
unnamedPeer := types.Uid(3)
|
||||||
|
store.Relations = &testRelationsStore{friends: []types.FriendListItem{{
|
||||||
|
Friendship: types.Friendship{
|
||||||
|
TenantID: 7,
|
||||||
|
UserID: 1,
|
||||||
|
PeerID: namedPeer,
|
||||||
|
Status: types.RelationshipFriend,
|
||||||
|
Topic: types.Uid(1).P2PName(namedPeer),
|
||||||
|
CreatedAt: now,
|
||||||
|
UpdatedAt: now,
|
||||||
|
},
|
||||||
|
Peer: &types.User{ObjHeader: types.ObjHeader{Id: namedPeer.String()}, TenantID: 7, Public: map[string]any{"fn": "yang"}},
|
||||||
|
}, {
|
||||||
|
Friendship: types.Friendship{
|
||||||
|
TenantID: 7,
|
||||||
|
UserID: 1,
|
||||||
|
PeerID: unnamedPeer,
|
||||||
|
Status: types.RelationshipFriend,
|
||||||
|
Topic: types.Uid(1).P2PName(unnamedPeer),
|
||||||
|
CreatedAt: now,
|
||||||
|
UpdatedAt: now,
|
||||||
|
},
|
||||||
|
Peer: &types.User{ObjHeader: types.ObjHeader{Id: unnamedPeer.String()}, TenantID: 7, Public: map[string]any{}},
|
||||||
|
}}}
|
||||||
|
defer func() { store.Relations = oldRelations }()
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodGet, "/v1/im/friends", nil)
|
||||||
|
req.Header.Set("Authorization", "Bearer token-1")
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
|
||||||
|
serveIMFriends(rec, req)
|
||||||
|
|
||||||
|
if rec.Code != http.StatusOK {
|
||||||
|
t.Fatalf("status: got %d, want %d; body=%s", rec.Code, http.StatusOK, rec.Body.String())
|
||||||
|
}
|
||||||
|
data := decodeIMHTTPResponse(t, rec).Data.(map[string]any)
|
||||||
|
items := data["items"].([]any)
|
||||||
|
if len(items) != 2 {
|
||||||
|
t.Fatalf("unexpected friends list length: %#v", data)
|
||||||
|
}
|
||||||
|
named := items[0].(map[string]any)
|
||||||
|
if named["display_name"] != "yang" || named["display_name_source"] != "profile" {
|
||||||
|
t.Fatalf("named friend should use profile display: %#v", named)
|
||||||
|
}
|
||||||
|
unnamed := items[1].(map[string]any)
|
||||||
|
if unnamed["display_name"] != unnamed["user_id"] || unnamed["display_name_source"] != "user_id" {
|
||||||
|
t.Fatalf("unnamed friend should use user_id fallback source: %#v", unnamed)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestServeIMFriendRemark(t *testing.T) {
|
func TestServeIMFriendRemark(t *testing.T) {
|
||||||
ctrl := gomock.NewController(t)
|
ctrl := gomock.NewController(t)
|
||||||
defer ctrl.Finish()
|
defer ctrl.Finish()
|
||||||
|
|||||||
Reference in New Issue
Block a user