Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Pleroma
pleroma
Commits
5b08b470
Commit
5b08b470
authored
Mar 01, 2019
by
Maxim Filippov
🌚
Browse files
Add "local" params to users search
parent
adac7455
Changes
6
Hide whitespace changes
Inline
Side-by-side
docs/Admin-API.md
View file @
5b08b470
...
...
@@ -20,13 +20,14 @@ Authentication is required and the user must be an admin.
]
```
## `/api/pleroma/admin/users/search?query={query}`
## `/api/pleroma/admin/users/search?query={query}
&local={local}
`
### Search users
### Search users
by name or nickname
-
Method
`GET`
-
Params:
-
`query`
-
`query`
:
**string**
search term
-
`local`
:
**bool**
whether to return only local users
-
Response:
```
JSON
...
...
lib/pleroma/user.ex
View file @
5b08b470
...
...
@@ -755,18 +755,25 @@ def get_recipients_from_activity(%Activity{recipients: to}) do
Repo
.
all
(
query
)
end
def
search
(
qu
er
y
,
resolve
\\
false
,
for_user
\\
nil
,
limit
\\
20
)
do
def
search
(
t
er
m
,
options
\\
%{}
)
do
# Strip the beginning @ off if there is a query
query
=
String
.
trim_leading
(
query
,
"@"
)
term
=
String
.
trim_leading
(
term
,
"@"
)
query
=
options
[
:query
]
||
User
if
resolve
,
do
:
get_or_fetch
(
qu
er
y
)
if
options
[
:
resolve
]
,
do
:
get_or_fetch
(
t
er
m
)
fts_results
=
do_search
(
fts_search_subquery
(
query
),
for_user
,
%{
limit:
limit
})
fts_results
=
do_search
(
fts_search_subquery
(
term
,
query
),
options
[
:for_user
],
%{
limit:
options
[
:limit
]
})
{
:ok
,
trigram_results
}
=
Repo
.
transaction
(
fn
->
Ecto
.
Adapters
.
SQL
.
query
(
Repo
,
"select set_limit(0.25)"
,
[])
do_search
(
trigram_search_subquery
(
query
),
for_user
,
%{
limit:
limit
})
do_search
(
trigram_search_subquery
(
term
,
query
),
options
[
:for_user
],
%{
limit:
options
[
:limit
]
})
end
)
Enum
.
uniq_by
(
fts_results
++
trigram_results
,
&
&1
.
id
)
...
...
@@ -809,9 +816,9 @@ defp do_search(subquery, for_user, options) do
boost_search_results
(
results
,
for_user
)
end
defp
fts_search_subquery
(
query
)
do
defp
fts_search_subquery
(
term
,
query
)
do
processed_query
=
qu
er
y
t
er
m
|>
String
.
replace
(
~r/\W+/
,
" "
)
|>
String
.
trim
()
|>
String
.
split
()
...
...
@@ -819,7 +826,7 @@ defp fts_search_subquery(query) do
|>
Enum
.
join
(
" | "
)
from
(
u
in
Us
er
,
u
in
qu
er
y
,
select_merge:
%{
search_rank:
fragment
(
...
...
@@ -849,19 +856,19 @@ defp fts_search_subquery(query) do
)
end
defp
trigram_search_subquery
(
query
)
do
defp
trigram_search_subquery
(
term
,
query
)
do
from
(
u
in
Us
er
,
u
in
qu
er
y
,
select_merge:
%{
search_rank:
fragment
(
"similarity(?, trim(? || ' ' || coalesce(?, '')))"
,
^
qu
er
y
,
^
t
er
m
,
u
.
nickname
,
u
.
name
)
},
where:
fragment
(
"trim(? || ' ' || coalesce(?, '')) % ?"
,
u
.
nickname
,
u
.
name
,
^
qu
er
y
)
where:
fragment
(
"trim(? || ' ' || coalesce(?, '')) % ?"
,
u
.
nickname
,
u
.
name
,
^
t
er
m
)
)
end
...
...
@@ -1018,6 +1025,14 @@ def unblock_domain(user, domain) do
update_and_set_cache
(
cng
)
end
def
maybe_local_user_query
(
local
)
when
local
==
true
do
local_user_query
()
end
def
maybe_local_user_query
(
local
)
when
local
==
false
do
User
end
def
local_user_query
do
from
(
u
in
User
,
...
...
lib/pleroma/web/admin_api/admin_api_controller.ex
View file @
5b08b470
...
...
@@ -78,8 +78,14 @@ def list_users(%{assigns: %{user: admin}} = conn, %{"page" => page_string}) do
)
end
def
search_users
(%{
assigns:
%{
user:
admin
}}
=
conn
,
%{
"query"
=>
query
})
do
users
=
User
.
search
(
query
,
true
,
admin
,
@users_page_size
)
def
search_users
(%{
assigns:
%{
user:
admin
}}
=
conn
,
%{
"query"
=>
term
}
=
params
)
do
users
=
User
.
search
(
term
,
query:
User
.
maybe_local_user_query
(
params
[
"local"
]
==
"true"
),
resolve:
true
,
for_user:
admin
,
limit:
@users_page_size
)
conn
|>
json
(
...
...
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
View file @
5b08b470
...
...
@@ -894,7 +894,7 @@ def status_search(user, query) do
end
def
search2
(%{
assigns:
%{
user:
user
}}
=
conn
,
%{
"q"
=>
query
}
=
params
)
do
accounts
=
User
.
search
(
query
,
params
[
"resolve"
]
==
"true"
,
user
)
accounts
=
User
.
search
(
query
,
resolve:
params
[
"resolve"
]
==
"true"
,
for_user:
user
)
statuses
=
status_search
(
user
,
query
)
...
...
@@ -919,7 +919,7 @@ def search2(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
end
def
search
(%{
assigns:
%{
user:
user
}}
=
conn
,
%{
"q"
=>
query
}
=
params
)
do
accounts
=
User
.
search
(
query
,
params
[
"resolve"
]
==
"true"
,
user
)
accounts
=
User
.
search
(
query
,
resolve:
params
[
"resolve"
]
==
"true"
,
for_user:
user
)
statuses
=
status_search
(
user
,
query
)
...
...
@@ -941,7 +941,7 @@ def search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
end
def
account_search
(%{
assigns:
%{
user:
user
}}
=
conn
,
%{
"q"
=>
query
}
=
params
)
do
accounts
=
User
.
search
(
query
,
params
[
"resolve"
]
==
"true"
,
user
)
accounts
=
User
.
search
(
query
,
resolve:
params
[
"resolve"
]
==
"true"
,
for_user:
user
)
res
=
AccountView
.
render
(
"accounts.json"
,
users:
accounts
,
for:
user
,
as:
:user
)
...
...
lib/pleroma/web/twitter_api/twitter_api_controller.ex
View file @
5b08b470
...
...
@@ -702,7 +702,7 @@ def search(%{assigns: %{user: user}} = conn, %{"q" => _query} = params) do
end
def
search_user
(%{
assigns:
%{
user:
user
}}
=
conn
,
%{
"query"
=>
query
})
do
users
=
User
.
search
(
query
,
true
,
user
)
users
=
User
.
search
(
query
,
resolve:
true
,
for_user:
user
)
conn
|>
put_view
(
UserView
)
...
...
test/web/admin_api/admin_api_controller_test.exs
View file @
5b08b470
...
...
@@ -388,25 +388,51 @@ test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation" do
}
end
test
"GET /api/pleroma/admin/users/search"
do
admin
=
insert
(
:user
,
info:
%{
is_admin:
true
})
user
=
insert
(
:user
,
nickname:
"bob"
)
describe
"GET /api/pleroma/admin/users/search"
do
test
"regular search"
do
admin
=
insert
(
:user
,
info:
%{
is_admin:
true
})
user
=
insert
(
:user
,
nickname:
"bob"
)
conn
=
build_conn
()
|>
assign
(
:user
,
admin
)
|>
get
(
"/api/pleroma/admin/users/search?query=bo"
)
assert
json_response
(
conn
,
200
)
==
%{
"count"
=>
1
,
"page_size"
=>
50
,
"users"
=>
[
%{
"deactivated"
=>
user
.
info
.
deactivated
,
"id"
=>
user
.
id
,
"nickname"
=>
user
.
nickname
}
]
}
conn
=
build_conn
()
|>
assign
(
:user
,
admin
)
|>
get
(
"/api/pleroma/admin/users/search?query=bo"
)
assert
json_response
(
conn
,
200
)
==
%{
"count"
=>
1
,
"page_size"
=>
50
,
"users"
=>
[
%{
"deactivated"
=>
user
.
info
.
deactivated
,
"id"
=>
user
.
id
,
"nickname"
=>
user
.
nickname
}
]
}
end
test
"only local users"
do
admin
=
insert
(
:user
,
info:
%{
is_admin:
true
})
user
=
insert
(
:user
,
nickname:
"bob"
)
insert
(
:user
,
nickname:
"bobb"
,
local:
false
)
conn
=
build_conn
()
|>
assign
(
:user
,
admin
)
|>
get
(
"/api/pleroma/admin/users/search?query=bo&local=true"
)
assert
json_response
(
conn
,
200
)
==
%{
"count"
=>
1
,
"page_size"
=>
50
,
"users"
=>
[
%{
"deactivated"
=>
user
.
info
.
deactivated
,
"id"
=>
user
.
id
,
"nickname"
=>
user
.
nickname
}
]
}
end
end
end
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment