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
7b194873
Commit
7b194873
authored
Dec 06, 2018
by
Ivan Tashkinov
Browse files
[
#394
] Added `users.tags` and admin routes to tag and untag users. Added tests.
parent
ccf0b46d
Changes
8
Hide whitespace changes
Inline
Side-by-side
lib/pleroma/user.ex
View file @
7b194873
...
...
@@ -23,6 +23,7 @@ defmodule Pleroma.User do
field
(
:local
,
:boolean
,
default:
true
)
field
(
:follower_address
,
:string
)
field
(
:search_distance
,
:float
,
virtual:
true
)
field
(
:tags
,
{
:array
,
:string
},
default:
[])
field
(
:last_refreshed_at
,
:naive_datetime
)
has_many
(
:notifications
,
Notification
)
embeds_one
(
:info
,
Pleroma
.
User
.
Info
)
...
...
@@ -819,4 +820,46 @@ def parse_bio(bio, user \\ %User{info: %{source_data: %{}}}) do
CommonUtils
.
format_input
(
bio
,
mentions
,
tags
,
"text/plain"
)
|>
Formatter
.
emojify
(
emoji
)
end
def
tag
(
user_identifiers
,
tags
),
do
:
tag_or_untag
(
user_identifiers
,
tags
,
:tag
)
def
untag
(
user_identifiers
,
tags
),
do
:
tag_or_untag
(
user_identifiers
,
tags
,
:untag
)
defp
tag_or_untag
(
user_identifier
,
tags
,
action
)
when
not
is_list
(
user_identifier
),
do
:
tag_or_untag
([
user_identifier
],
tags
,
action
)
defp
tag_or_untag
([
hd
|
_
]
=
nicknames
,
tags
,
action
)
when
is_binary
(
hd
)
do
users
=
Repo
.
all
(
from
(
u
in
User
,
where:
u
.
nickname
in
^
nicknames
))
if
length
(
users
)
==
length
(
nicknames
)
do
tag_or_untag
(
users
,
tags
,
action
)
else
{
:error
,
:not_found
}
end
end
defp
tag_or_untag
([
hd
|
_
]
=
users
,
tags
,
action
)
when
is_map
(
hd
)
do
tags
=
[
tags
]
|>
List
.
flatten
()
|>
Enum
.
map
(
&
String
.
downcase
(
&1
))
Repo
.
transaction
(
fn
->
for
user
<-
users
do
new_tags
=
if
action
==
:tag
do
Enum
.
uniq
(
user
.
tags
++
tags
)
else
user
.
tags
--
tags
end
{
:ok
,
updated_user
}
=
user
|>
change
(%{
tags:
new_tags
})
|>
Repo
.
update
()
updated_user
end
end
)
end
end
lib/pleroma/web/admin_api/admin_api_controller.ex
View file @
7b194873
...
...
@@ -3,6 +3,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
alias
Pleroma
.
{
User
,
Repo
}
alias
Pleroma
.
Web
.
ActivityPub
.
Relay
import
Pleroma
.
Web
.
ControllerHelper
,
only:
[
json_response:
3
]
require
Logger
action_fallback
(
:errors
)
...
...
@@ -40,6 +42,16 @@ def user_create(
|>
json
(
new_user
.
nickname
)
end
def
tag_users
(
conn
,
%{
"nicknames"
=>
nicknames
,
"tags"
=>
tags
})
do
with
{
:ok
,
_
}
<-
User
.
tag
(
nicknames
,
tags
),
do
:
json_response
(
conn
,
:no_content
,
""
)
end
def
untag_users
(
conn
,
%{
"nicknames"
=>
nicknames
,
"tags"
=>
tags
})
do
with
{
:ok
,
_
}
<-
User
.
untag
(
nicknames
,
tags
),
do
:
json_response
(
conn
,
:no_content
,
""
)
end
def
right_add
(
conn
,
%{
"permission_group"
=>
permission_group
,
"nickname"
=>
nickname
})
when
permission_group
in
[
"moderator"
,
"admin"
]
do
user
=
User
.
get_by_nickname
(
nickname
)
...
...
lib/pleroma/web/controller_helper.ex
0 → 100644
View file @
7b194873
defmodule
Pleroma
.
Web
.
ControllerHelper
do
use
Pleroma
.
Web
,
:controller
def
json_response
(
conn
,
status
,
json
)
do
conn
|>
put_status
(
status
)
|>
json
(
json
)
end
end
lib/pleroma/web/mastodon_api/views/account_view.ex
View file @
7b194873
...
...
@@ -58,7 +58,9 @@ def render("account.json", %{user: user} = opts) do
note:
""
,
privacy:
user_info
.
default_scope
,
sensitive:
false
}
},
# Note: Mastodon does not return this field:
tags:
user
.
tags
}
end
...
...
lib/pleroma/web/router.ex
View file @
7b194873
...
...
@@ -98,6 +98,8 @@ defmodule Pleroma.Web.Router do
pipe_through
(
:admin_api
)
delete
(
"/user"
,
AdminAPIController
,
:user_delete
)
post
(
"/user"
,
AdminAPIController
,
:user_create
)
put
(
"/users/tag"
,
AdminAPIController
,
:tag_users
)
put
(
"/users/untag"
,
AdminAPIController
,
:untag_users
)
get
(
"/permission_group/:nickname"
,
AdminAPIController
,
:right_get
)
get
(
"/permission_group/:nickname/:permission_group"
,
AdminAPIController
,
:right_get
)
...
...
lib/pleroma/web/twitter_api/views/user_view.ex
View file @
7b194873
...
...
@@ -77,7 +77,9 @@ def render("user.json", %{user: user = %User{}} = assigns) do
"locked"
=>
user
.
info
.
locked
,
"default_scope"
=>
user
.
info
.
default_scope
,
"no_rich_text"
=>
user
.
info
.
no_rich_text
,
"fields"
=>
fields
"fields"
=>
fields
,
# Note: twitter.com does not return this field:
"tags"
=>
user
.
tags
}
if
assigns
[
:token
]
do
...
...
priv/repo/migrations/20181206125616_add_tags_to_users.exs
0 → 100644
View file @
7b194873
defmodule
Pleroma
.
Repo
.
Migrations
.
AddTagsToUsers
do
use
Ecto
.
Migration
def
change
do
alter
table
(
:users
)
do
add
:tags
,
{
:array
,
:string
}
end
create
index
(
:users
,
[
:tags
],
using:
:gin
)
end
end
test/web/admin_api/admin_api_controller_test.exs
View file @
7b194873
...
...
@@ -37,6 +37,62 @@ test "Create" do
end
end
describe
"/api/pleroma/admin//users/tag"
do
setup
do
admin
=
insert
(
:user
,
info:
%{
is_admin:
true
})
user1
=
insert
(
:user
,
%{
tags:
[
"x"
]})
user2
=
insert
(
:user
,
%{
tags:
[
"y"
]})
user3
=
insert
(
:user
,
%{
tags:
[
"unchanged"
]})
conn
=
build_conn
()
|>
assign
(
:user
,
admin
)
|>
put_req_header
(
"accept"
,
"application/json"
)
|>
put
(
"/api/pleroma/admin/users/tag?nicknames[]=
#{
user1
.
nickname
}
&nicknames[]=
#{
user2
.
nickname
}
&tags[]=foo&tags[]=bar"
)
%{
conn:
conn
,
user1:
user1
,
user2:
user2
,
user3:
user3
}
end
test
"it appends specified tags to users with specified nicknames"
,
%{
conn:
conn
,
user1:
user1
,
user2:
user2
}
do
assert
json_response
(
conn
,
:no_content
)
assert
Repo
.
get
(
User
,
user1
.
id
)
.
tags
==
[
"x"
,
"foo"
,
"bar"
]
assert
Repo
.
get
(
User
,
user2
.
id
)
.
tags
==
[
"y"
,
"foo"
,
"bar"
]
end
test
"it does not modify tags of not specified users"
,
%{
conn:
conn
,
user3:
user3
}
do
assert
json_response
(
conn
,
:no_content
)
assert
Repo
.
get
(
User
,
user3
.
id
)
.
tags
==
[
"unchanged"
]
end
end
describe
"/api/pleroma/admin//users/untag"
do
setup
do
admin
=
insert
(
:user
,
info:
%{
is_admin:
true
})
user1
=
insert
(
:user
,
%{
tags:
[
"x"
]})
user2
=
insert
(
:user
,
%{
tags:
[
"y"
,
"z"
]})
user3
=
insert
(
:user
,
%{
tags:
[
"unchanged"
]})
conn
=
build_conn
()
|>
assign
(
:user
,
admin
)
|>
put_req_header
(
"accept"
,
"application/json"
)
|>
put
(
"/api/pleroma/admin/users/untag?nicknames[]=
#{
user1
.
nickname
}
&nicknames[]=
#{
user2
.
nickname
}
&tags[]=x&tags[]=z"
)
%{
conn:
conn
,
user1:
user1
,
user2:
user2
,
user3:
user3
}
end
test
"it removes specified tags from users with specified nicknames"
,
%{
conn:
conn
,
user1:
user1
,
user2:
user2
}
do
assert
json_response
(
conn
,
:no_content
)
assert
Repo
.
get
(
User
,
user1
.
id
)
.
tags
==
[]
assert
Repo
.
get
(
User
,
user2
.
id
)
.
tags
==
[
"y"
]
end
test
"it does not modify tags of not specified users"
,
%{
conn:
conn
,
user3:
user3
}
do
assert
json_response
(
conn
,
:no_content
)
assert
Repo
.
get
(
User
,
user3
.
id
)
.
tags
==
[
"unchanged"
]
end
end
describe
"/api/pleroma/admin/permission_group"
do
test
"GET is giving user_info"
do
admin
=
insert
(
:user
,
info:
%{
is_admin:
true
})
...
...
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