Add context and inReplyTo.

This commit is contained in:
Roger Braun 2017-03-23 23:34:10 +01:00
parent 74112ef99e
commit e56dba1563
3 changed files with 57 additions and 10 deletions

View File

@ -17,19 +17,23 @@ def insert(map) when is_map(map) do
end end
def generate_activity_id do def generate_activity_id do
host = generate_id("activities")
Application.get_env(:pleroma, Pleroma.Web.Endpoint) end
|> Keyword.fetch!(:url)
|> Keyword.fetch!(:host) def generate_context_id do
"https://#{host}/activities/#{Ecto.UUID.generate}" generate_id("contexts")
end end
def generate_object_id do def generate_object_id do
generate_id("objects")
end
def generate_id(type) do
host = host =
Application.get_env(:pleroma, Pleroma.Web.Endpoint) Application.get_env(:pleroma, Pleroma.Web.Endpoint)
|> Keyword.fetch!(:url) |> Keyword.fetch!(:url)
|> Keyword.fetch!(:host) |> Keyword.fetch!(:host)
"https://#{host}/objects/#{Ecto.UUID.generate}" "https://#{host}/#{type}/#{Ecto.UUID.generate}"
end end
def fetch_public_activities(opts \\ %{}) do def fetch_public_activities(opts \\ %{}) do

View File

@ -1,11 +1,12 @@
defmodule Pleroma.Web.TwitterAPI.TwitterAPI do defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
alias Pleroma.User alias Pleroma.{User, Activity, Repo}
alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Repo
alias Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter alias Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter
def create_status(user = %User{}, data = %{}) do def create_status(user = %User{}, data = %{}) do
date = DateTime.utc_now() |> DateTime.to_iso8601 date = DateTime.utc_now() |> DateTime.to_iso8601
context = ActivityPub.generate_context_id
activity = %{ activity = %{
"type" => "Create", "type" => "Create",
"to" => [ "to" => [
@ -16,11 +17,27 @@ def create_status(user = %User{}, data = %{}) do
"object" => %{ "object" => %{
"type" => "Note", "type" => "Note",
"content" => data["status"], "content" => data["status"],
"published" => date "published" => date,
"context" => context
}, },
"published" => date "published" => date,
"context" => context
} }
# Wire up reply info.
activity = with inReplyToId when not is_nil(inReplyToId) <- data["in_reply_to_status_id"],
inReplyTo <- Repo.get(Activity, inReplyToId),
context <- inReplyTo.data["context"]
do
activity
|> put_in(["context"], context)
|> put_in(["object", "context"], context)
|> put_in(["object", "inReplyTo"], inReplyTo.data["object"]["id"])
|> put_in(["object", "inReplyToStatusId"], inReplyToId)
else _e ->
activity
end
ActivityPub.insert(activity) ActivityPub.insert(activity)
end end

View File

@ -18,6 +18,32 @@ test "create a status" do
assert get_in(activity.data, ["actor"]) == User.ap_id(user) assert get_in(activity.data, ["actor"]) == User.ap_id(user)
assert Enum.member?(get_in(activity.data, ["to"]), User.ap_followers(user)) assert Enum.member?(get_in(activity.data, ["to"]), User.ap_followers(user))
assert Enum.member?(get_in(activity.data, ["to"]), "https://www.w3.org/ns/activitystreams#Public") assert Enum.member?(get_in(activity.data, ["to"]), "https://www.w3.org/ns/activitystreams#Public")
# Add a context
assert is_binary(get_in(activity.data, ["context"]))
assert is_binary(get_in(activity.data, ["object", "context"]))
end
test "create a status that is a reply" do
user = UserBuilder.build
input = %{
"status" => "Hello again."
}
{ :ok, activity = %Activity{} } = TwitterAPI.create_status(user, input)
input = %{
"status" => "Here's your (you).",
"in_reply_to_status_id" => activity.id
}
{ :ok, reply = %Activity{} } = TwitterAPI.create_status(user, input)
assert get_in(reply.data, ["context"]) == get_in(activity.data, ["context"])
assert get_in(reply.data, ["object", "context"]) == get_in(activity.data, ["object", "context"])
assert get_in(reply.data, ["object", "context"]) == get_in(activity.data, ["object", "context"])
assert get_in(reply.data, ["object", "inReplyTo"]) == get_in(activity.data, ["object", "id"])
assert get_in(reply.data, ["object", "inReplyToStatusId"]) == activity.id
end end
test "fetch public statuses" do test "fetch public statuses" do