Add context and inReplyTo.
This commit is contained in:
parent
74112ef99e
commit
e56dba1563
3 changed files with 57 additions and 10 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue