fix(gateway): match member search on username and global name (#2791)

This commit is contained in:
Hampus
2026-09-15 08:48:33 +02:00
committed by GitHub
parent f4c5fee17e
commit a08615e306
3 changed files with 76 additions and 4 deletions
@@ -130,10 +130,21 @@ filter_members_by_query([Member | Rest], NormalizedQuery, Limit, Acc) ->
end.
-spec member_matches_normalized_query(member(), binary()) -> boolean().
member_matches_normalized_query(Member, NormalizedQuery) ->
DisplayName = get_display_name(Member),
NormalizedName = string:lowercase(DisplayName),
prefix_binary(NormalizedQuery, NormalizedName).
member_matches_normalized_query(_Member, <<>>) ->
true;
member_matches_normalized_query(Member, NormalizedQuery) when is_map(Member) ->
User = map_utils:ensure_map(maps:get(<<"user">>, Member, #{})),
name_matches(maps:get(<<"nick">>, Member, undefined), NormalizedQuery) orelse
name_matches(maps:get(<<"global_name">>, User, undefined), NormalizedQuery) orelse
name_matches(maps:get(<<"username">>, User, undefined), NormalizedQuery);
member_matches_normalized_query(_Member, _NormalizedQuery) ->
false.
-spec name_matches(term(), binary()) -> boolean().
name_matches(Name, NormalizedQuery) when is_binary(Name) ->
prefix_binary(NormalizedQuery, string:lowercase(Name));
name_matches(_Name, _NormalizedQuery) ->
false.
-spec prefix_binary(binary(), binary()) -> boolean().
prefix_binary(Prefix, Value) ->
+11
View File
@@ -357,6 +357,17 @@ search_guild_members_limits_prefix_matches_without_paginating_all_test() ->
)
).
search_guild_members_matches_username_of_nicknamed_member_test() ->
Nicknamed = (member(1, <<"jiralite">>))#{<<"nick">> => <<"Specsaver engineer">>},
State = #{data => #{<<"members">> => [Nicknamed, member(2, <<"Bob">>)]}},
{reply, Reply, _State} = guild_data:search_guild_members(
#{query => <<"jiralite">>, limit => 25}, State
),
?assertEqual(
[1],
[guild_request_members_search:extract_user_id(M) || M <- maps:get(members, Reply)]
).
get_guild_state_includes_parent_category_when_child_channel_is_visible_test() ->
GuildId = 50,
UserId = 300,
@@ -95,6 +95,56 @@ filter_members_by_query_matches_nick_test() ->
Results = guild_request_members_search:filter_members_by_query(Members, <<"super">>, 10),
?assertEqual(1, length(Results)).
filter_members_by_query_matches_username_behind_nick_test() ->
Members = [
#{
<<"user">> => #{
<<"id">> => <<"1">>,
<<"username">> => <<"jiralite">>,
<<"global_name">> => <<"Jiralite">>
},
<<"nick">> => <<"Specsaver engineer">>
},
#{<<"user">> => #{<<"id">> => <<"2">>, <<"username">> => <<"bob">>}}
],
[Match] = guild_request_members_search:filter_members_by_query(Members, <<"JIRA">>, 10),
?assertEqual(1, guild_request_members_search:extract_user_id(Match)).
member_matches_every_name_test() ->
Member = #{
<<"user">> => #{
<<"id">> => <<"1">>,
<<"username">> => <<"jiralite">>,
<<"global_name">> => <<"Jira Lite">>
},
<<"nick">> => <<"Specsaver engineer">>
},
Matches = fun(Query) ->
guild_request_members_search:member_matches_normalized_query(Member, Query)
end,
?assert(Matches(<<"specsaver">>)),
?assert(Matches(<<"jira l">>)),
?assert(Matches(<<"jiral">>)),
?assert(Matches(<<>>)),
?assertNot(Matches(<<"engineer">>)),
?assertNot(Matches(<<"lite">>)).
member_matches_ignores_non_binary_names_test() ->
Member = #{
<<"user">> => #{<<"username">> => <<"user">>, <<"global_name">> => null},
<<"nick">> => 12345
},
?assert(guild_request_members_search:member_matches_normalized_query(Member, <<"us">>)),
?assertNot(guild_request_members_search:member_matches_normalized_query(Member, <<"12">>)).
member_matches_non_map_member_test() ->
?assert(
guild_request_members_search:member_matches_normalized_query(invalid_member(), <<>>)
),
?assertNot(
guild_request_members_search:member_matches_normalized_query(invalid_member(), <<"a">>)
).
fetch_members_with_query_uses_guild_search_call_test() ->
Parent = self(),
Member = #{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"Alice">>}},