Skip to content
GitLab
Menu
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
a4db3a73
Commit
a4db3a73
authored
Apr 02, 2018
by
lain
Browse files
Pre-fetch conversation ids.
parent
cd543d58
Changes
2
Hide whitespace changes
Inline
Side-by-side
lib/pleroma/web/twitter_api/views/activity_view.ex
View file @
a4db3a73
...
...
@@ -7,9 +7,44 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
alias
Pleroma
.
Web
.
TwitterAPI
.
TwitterAPI
alias
Pleroma
.
Web
.
TwitterAPI
.
Representers
.
ObjectRepresenter
alias
Pleroma
.
Activity
alias
Pleroma
.
Object
alias
Pleroma
.
Repo
alias
Pleroma
.
Formatter
import
Ecto
.
Query
defp
query_context_ids
(
contexts
)
do
query
=
from
o
in
Object
,
where:
fragment
(
"(?)->>'id' = ANY(?)"
,
o
.
data
,
^
contexts
)
Repo
.
all
(
query
)
end
defp
collect_context_ids
(
activities
)
do
contexts
=
activities
|>
Enum
.
map
(
fn
(%{
data:
data
})
->
data
[
"context"
]
end
)
|>
Enum
.
filter
(
&
(
&1
))
|>
query_context_ids
()
|>
Enum
.
reduce
(%{},
fn
(%{
data:
%{
"id"
=>
ap_id
},
id:
id
},
acc
)
->
Map
.
put
(
acc
,
ap_id
,
id
)
end
)
end
defp
get_context_id
(%{
data:
%{
"context"
=>
nil
}}),
do
:
nil
defp
get_context_id
(%{
data:
%{
"context"
=>
context
}},
options
)
do
cond
do
id
=
options
[
:context_ids
][
context
]
->
id
true
->
TwitterAPI
.
context_to_conversation_id
(
context
)
end
end
def
render
(
"index.json"
,
opts
)
do
context_ids
=
collect_context_ids
(
opts
.
activities
)
opts
=
opts
|>
Map
.
put
(
:context_ids
,
context_ids
)
render_many
(
opts
.
activities
,
ActivityView
,
...
...
@@ -80,7 +115,7 @@ def render("activity.json", %{activity: %{data: %{"type" => "Announce"}} = activ
"uri"
=>
"tag:
#{
activity
.
data
[
"id"
]
}
:objectType=note"
,
"created_at"
=>
created_at
,
"retweeted_status"
=>
retweeted_status
,
"statusnet_conversation_id"
=>
conversation
_id
(
announced_activity
),
"statusnet_conversation_id"
=>
get_context
_id
(
announced_activity
,
opts
),
"external_url"
=>
activity
.
data
[
"id"
],
"activity_type"
=>
"repeat"
}
...
...
@@ -130,7 +165,7 @@ def render(
|>
Enum
.
filter
(
&
&1
)
|>
Enum
.
map
(
fn
user
->
UserView
.
render
(
"show.json"
,
%{
user:
user
,
for:
opts
[
:for
]})
end
)
conversation_id
=
conversation
_id
(
activity
)
conversation_id
=
get_context
_id
(
activity
,
opts
)
tags
=
activity
.
data
[
"object"
][
"tag"
]
||
[]
possibly_sensitive
=
activity
.
data
[
"object"
][
"sensitive"
]
||
Enum
.
member?
(
tags
,
"nsfw"
)
...
...
test/web/twitter_api/views/activity_view_test.exs
View file @
a4db3a73
...
...
@@ -10,7 +10,9 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
alias
Pleroma
.
Activity
alias
Pleroma
.
User
alias
Pleroma
.
Web
.
ActivityPub
.
ActivityPub
import
Pleroma
.
Factory
import
Mock
test
"a create activity with a note"
do
user
=
insert
(
:user
)
...
...
@@ -51,6 +53,30 @@ test "a create activity with a note" do
assert
result
==
expected
end
test
"a list of activities"
do
user
=
insert
(
:user
)
other_user
=
insert
(
:user
,
%{
nickname:
"shp"
})
{
:ok
,
activity
}
=
CommonAPI
.
post
(
user
,
%{
"status"
=>
"Hey @shp!"
})
convo_id
=
TwitterAPI
.
context_to_conversation_id
(
activity
.
data
[
"object"
][
"context"
])
mocks
=
[
{
TwitterAPI
,
[],
[
context_to_conversation_id:
fn
(
_
)
->
false
end
]
}
]
with_mocks
mocks
do
[
result
]
=
ActivityView
.
render
(
"index.json"
,
activities:
[
activity
])
assert
result
[
"statusnet_conversation_id"
]
==
convo_id
assert
result
[
"user"
]
refute
called
TwitterAPI
.
context_to_conversation_id
(
:_
)
end
end
test
"an activity that is a reply"
do
user
=
insert
(
:user
)
other_user
=
insert
(
:user
,
%{
nickname:
"shp"
})
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a 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