From 1ccbe562c950e588e24822d20f802dd99b01bd79 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Thu, 13 Apr 2017 14:56:19 +0200 Subject: Add actor to objects. --- lib/pleroma/web/twitter_api/twitter_api.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 0217b28d6..a195301ee 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -37,7 +37,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do "content" => content_html, "published" => date, "context" => context, - "attachment" => attachments + "attachment" => attachments, + "actor" => user.ap_id }, "published" => date, "context" => context -- cgit v1.2.3 From f97c8e43792f76e84c436e75b0c0893d3c16d7d8 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Thu, 13 Apr 2017 15:49:42 +0200 Subject: Add utility functions for objects and activities. --- lib/pleroma/activity.ex | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index c4efc6283..46568bb13 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -1,9 +1,21 @@ defmodule Pleroma.Activity do use Ecto.Schema + alias Pleroma.{Repo, Activity} + import Ecto.Query schema "activities" do field :data, :map timestamps() end + + def get_by_ap_id(ap_id) do + Repo.one(from activity in Activity, + where: fragment("? @> ?", activity.data, ^%{id: ap_id})) + end + + def all_by_object_ap_id(ap_id) do + Repo.all(from activity in Activity, + where: fragment("? @> ?", activity.data, ^%{object: %{id: ap_id}})) + end end -- cgit v1.2.3 From 1388054796feed8f03d659171bbbc0c21056dd2f Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Thu, 13 Apr 2017 15:50:05 +0200 Subject: Add liking to ActivityPub. --- lib/pleroma/web/activity_pub/activity_pub.ex | 34 ++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 75e4101f2..10efa2c9d 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1,10 +1,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do alias Pleroma.Repo - alias Pleroma.{Activity, Object, Upload} + alias Pleroma.{Activity, Object, Upload, User} import Ecto.Query def insert(map) when is_map(map) do - map = Map.put_new_lazy(map, "id", &generate_activity_id/0) + map = map + |> Map.put_new_lazy("id", &generate_activity_id/0) + |> Map.put_new_lazy("published", &make_date/0) map = if is_map(map["object"]) do object = Map.put_new_lazy(map["object"], "id", &generate_object_id/0) @@ -17,6 +19,30 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do Repo.insert(%Activity{data: map}) end + def like(%User{ap_id: ap_id}, object = %Object{data: %{ "id" => id}}) do + data = %{ + "type" => "Like", + "actor" => ap_id, + "object" => id + } + + {:ok, activity} = insert(data) + like_count = (object.data["like_count"] || 0) + 1 + new_data = object.data |> Map.put("like_count", like_count) + changeset = Ecto.Changeset.change(object, data: new_data) + {:ok, object} = Repo.update(changeset) + + # Update activities that already had this. Could be done in a seperate process. + relevant_activities = Activity.all_by_object_ap_id(id) + Enum.map(relevant_activities, fn (activity) -> + new_activity_data = activity.data |> Map.put("object", new_data) + changeset = Ecto.Changeset.change(activity, data: new_activity_data) + Repo.update(changeset) + end) + + {:ok, activity, object} + end + def generate_activity_id do generate_id("activities") end @@ -74,4 +100,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do data = Upload.store(file) Repo.insert(%Object{data: data}) end + + defp make_date do + DateTime.utc_now() |> DateTime.to_iso8601 + end end -- cgit v1.2.3 From 653d605e14d25658d398148748335dc58f9f2229 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Thu, 13 Apr 2017 16:19:07 +0200 Subject: Add favoriting to twitter api. --- .../web/twitter_api/representers/activity_representer.ex | 6 ++++-- lib/pleroma/web/twitter_api/twitter_api.ex | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/representers/activity_representer.ex b/lib/pleroma/web/twitter_api/representers/activity_representer.ex index 9e4ffaefe..6a5304049 100644 --- a/lib/pleroma/web/twitter_api/representers/activity_representer.ex +++ b/lib/pleroma/web/twitter_api/representers/activity_representer.ex @@ -25,6 +25,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do content = get_in(activity.data, ["object", "content"]) created_at = get_in(activity.data, ["object", "published"]) |> date_to_asctime + like_count = get_in(activity.data, ["object", "like_count"]) || 0 mentions = opts[:mentioned] || [] @@ -45,14 +46,15 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do "in_reply_to_status_id" => activity.data["object"]["inReplyToStatusId"], "statusnet_conversation_id" => activity.data["object"]["statusnetConversationId"], "attachments" => (activity.data["object"]["attachment"] || []) |> ObjectRepresenter.enum_to_list(opts), - "attentions" => attentions + "attentions" => attentions, + "fave_num" => like_count } end defp date_to_asctime(date) do with {:ok, date, _offset} <- date |> DateTime.from_iso8601 do Calendar.Strftime.strftime!(date, "%a %b %d %H:%M:%S %z %Y") - else e -> + else _e -> "" end end diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index a195301ee..2679397d9 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -124,6 +124,19 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end end + def favorite(%User{} = user, %Activity{data: %{"object" => object}} = activity) do + object = Object.get_by_ap_id(object["id"]) + + {:ok, _like_activity, object} = ActivityPub.like(user, object) + new_data = activity.data + |> Map.put("object", object.data) + + status = %{activity | data: new_data} + |> activity_to_status(%{for: user}) + + {:ok, status} + end + def upload(%Plug.Upload{} = file) do {:ok, object} = ActivityPub.upload(file) -- cgit v1.2.3 From d0da40dc81f5db2b3d335fb47d00d0ac52c2cba3 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Thu, 13 Apr 2017 17:05:53 +0200 Subject: Display like activities. --- .../twitter_api/representers/activity_representer.ex | 19 +++++++++++++++++++ lib/pleroma/web/twitter_api/twitter_api.ex | 9 +++++++++ 2 files changed, 28 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/representers/activity_representer.ex b/lib/pleroma/web/twitter_api/representers/activity_representer.ex index 6a5304049..ed8655905 100644 --- a/lib/pleroma/web/twitter_api/representers/activity_representer.ex +++ b/lib/pleroma/web/twitter_api/representers/activity_representer.ex @@ -4,6 +4,25 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do alias Pleroma.Activity + def to_map(%Activity{data: %{"type" => "Like"}} = activity, %{user: user, liked_activity: liked_activity} = opts) do + created_at = get_in(activity.data, ["published"]) + |> date_to_asctime + + text = "#{user.nickname} favorited a status." + + %{ + "id" => activity.id, + "user" => UserRepresenter.to_map(user, opts), + "statusnet_html" => text, # TODO: add summary + "text" => text, + "is_local" => true, + "is_post_verb" => false, + "uri" => "tag:#{activity.data["id"]}:objectType=Favourite", + "created_at" => created_at, + "in_reply_to_status_id" => liked_activity.id, + } + end + def to_map(%Activity{data: %{"type" => "Follow"}} = activity, %{user: user} = opts) do created_at = get_in(activity.data, ["published"]) |> date_to_asctime diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 2679397d9..33ddebbc1 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -192,6 +192,15 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end) end + # For likes, fetch the liked activity, too. + defp activity_to_status(%Activity{data: %{"type" => "Like"}} = activity, opts) do + actor = get_in(activity.data, ["actor"]) + user = Repo.get_by!(User, ap_id: actor) + [liked_activity] = Activity.all_by_object_ap_id(activity.data["object"]) + + ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, liked_activity: liked_activity})) + end + defp activity_to_status(activity, opts) do actor = get_in(activity.data, ["actor"]) user = Repo.get_by!(User, ap_id: actor) -- cgit v1.2.3 From 5cb446a148ab7f935b4fc90e4d353d10e18f9f7d Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Thu, 13 Apr 2017 17:22:44 +0200 Subject: Add favoriting to TwAPI controller. --- lib/pleroma/web/router.ex | 1 + lib/pleroma/web/twitter_api/twitter_api_controller.ex | 10 ++++++++++ 2 files changed, 11 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 40350ad0c..a61e32b40 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -39,5 +39,6 @@ defmodule Pleroma.Web.Router do post "/friendships/create", TwitterAPI.Controller, :follow post "/friendships/destroy", TwitterAPI.Controller, :unfollow post "/statusnet/media/upload", TwitterAPI.Controller, :upload + post "/favorites/create/:id", TwitterAPI.Controller, :favorite end end diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index 3f299a941..3969e92a6 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -2,6 +2,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do use Pleroma.Web, :controller alias Pleroma.Web.TwitterAPI.TwitterAPI alias Pleroma.Web.TwitterAPI.Representers.{UserRepresenter, ActivityRepresenter} + alias Pleroma.{Repo, Activity} def verify_credentials(%{assigns: %{user: user}} = conn, _params) do response = user |> UserRepresenter.to_json(%{for: user}) @@ -97,6 +98,15 @@ defmodule Pleroma.Web.TwitterAPI.Controller do |> json_reply(200, response) end + def favorite(%{assigns: %{user: user}} = conn, %{"id" => id}) do + activity = Repo.get(Activity, id) + {:ok, status} = TwitterAPI.favorite(user, activity) + response = Poison.encode!(status) + + conn + |> json_reply(200, response) + end + defp json_reply(conn, status, json) do conn |> put_resp_content_type("application/json") -- cgit v1.2.3 From fa0c279139f384f6c97bce217be4131b255f00b1 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Fri, 14 Apr 2017 15:07:24 +0200 Subject: Favorite changes. - Add 'likes' to activity, collection of ids of people who liked it. - show if you favorited something or not. - Don't allow double favorites - Address favorites to the followers of the liked activity's author. --- lib/pleroma/web/activity_pub/activity_pub.ex | 59 ++++++++++++++-------- .../representers/activity_representer.ex | 4 +- 2 files changed, 40 insertions(+), 23 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 10efa2c9d..b9ba72b0d 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -19,28 +19,43 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do Repo.insert(%Activity{data: map}) end - def like(%User{ap_id: ap_id}, object = %Object{data: %{ "id" => id}}) do - data = %{ - "type" => "Like", - "actor" => ap_id, - "object" => id - } - - {:ok, activity} = insert(data) - like_count = (object.data["like_count"] || 0) + 1 - new_data = object.data |> Map.put("like_count", like_count) - changeset = Ecto.Changeset.change(object, data: new_data) - {:ok, object} = Repo.update(changeset) - - # Update activities that already had this. Could be done in a seperate process. - relevant_activities = Activity.all_by_object_ap_id(id) - Enum.map(relevant_activities, fn (activity) -> - new_activity_data = activity.data |> Map.put("object", new_data) - changeset = Ecto.Changeset.change(activity, data: new_activity_data) - Repo.update(changeset) - end) - - {:ok, activity, object} + def like(%User{ap_id: ap_id} = user, %Object{data: %{ "id" => id}} = object) do + cond do + # There's already a like here, so return the original activity. + ap_id in (object.data["likes"] || []) -> + query = from activity in Activity, + where: fragment("? @> ?", activity.data, ^%{actor: ap_id, object: id}) + + activity = Repo.one(query) + {:ok, activity, object} + true -> + data = %{ + "type" => "Like", + "actor" => ap_id, + "object" => id, + "to" => [User.ap_followers(user)] + } + + {:ok, activity} = insert(data) + + likes = [ap_id | (object.data["likes"] || [])] |> Enum.uniq + + new_data = object.data + |> Map.put("like_count", length(likes)) + |> Map.put("likes", likes) + + changeset = Ecto.Changeset.change(object, data: new_data) + {:ok, object} = Repo.update(changeset) + + # Update activities that already had this. Could be done in a seperate process. + relevant_activities = Activity.all_by_object_ap_id(id) + Enum.map(relevant_activities, fn (activity) -> + new_activity_data = activity.data |> Map.put("object", new_data) + changeset = Ecto.Changeset.change(activity, data: new_activity_data) + Repo.update(changeset) + end) + {:ok, activity, object} + end end def generate_activity_id do diff --git a/lib/pleroma/web/twitter_api/representers/activity_representer.ex b/lib/pleroma/web/twitter_api/representers/activity_representer.ex index ed8655905..e69a63e1d 100644 --- a/lib/pleroma/web/twitter_api/representers/activity_representer.ex +++ b/lib/pleroma/web/twitter_api/representers/activity_representer.ex @@ -45,6 +45,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do created_at = get_in(activity.data, ["object", "published"]) |> date_to_asctime like_count = get_in(activity.data, ["object", "like_count"]) || 0 + favorited = opts[:for] && opts[:for].ap_id in (activity.data["object"]["likes"] || []) mentions = opts[:mentioned] || [] @@ -66,7 +67,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do "statusnet_conversation_id" => activity.data["object"]["statusnetConversationId"], "attachments" => (activity.data["object"]["attachment"] || []) |> ObjectRepresenter.enum_to_list(opts), "attentions" => attentions, - "fave_num" => like_count + "fave_num" => like_count, + "favorited" => !!favorited } end -- cgit v1.2.3 From 90b38fd51b4d40b6240ff5e5e3bb852eb18f97df Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Fri, 14 Apr 2017 16:13:34 +0200 Subject: Fix uploads and favorites in twidere / twittnuker. --- lib/pleroma/web/router.ex | 2 ++ lib/pleroma/web/twitter_api/twitter_api.ex | 36 ++++++++++++++-------- .../web/twitter_api/twitter_api_controller.ex | 6 ++++ 3 files changed, 31 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index a61e32b40..e11086538 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -39,6 +39,8 @@ defmodule Pleroma.Web.Router do post "/friendships/create", TwitterAPI.Controller, :follow post "/friendships/destroy", TwitterAPI.Controller, :unfollow post "/statusnet/media/upload", TwitterAPI.Controller, :upload + post "/media/upload", TwitterAPI.Controller, :upload_json post "/favorites/create/:id", TwitterAPI.Controller, :favorite + post "/favorites/create", TwitterAPI.Controller, :favorite end end diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 33ddebbc1..19f3c1c8c 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -137,25 +137,35 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do {:ok, status} end - def upload(%Plug.Upload{} = file) do + def upload(%Plug.Upload{} = file, format \\ "xml") do {:ok, object} = ActivityPub.upload(file) url = List.first(object.data["url"]) href = url["href"] type = url["mediaType"] - # Fake this as good as possible... - """ - - - #{object.id} - #{object.id} - #{object.id} - #{href} - #{href} - - - """ + case format do + "xml" -> + # Fake this as good as possible... + """ + + + #{object.id} + #{object.id} + #{object.id} + #{href} + #{href} + + + """ + "json" -> + %{ + media_id: object.id, + media_id_string: "#{object.id}}", + media_url: href, + size: 0 + } |> Poison.encode! + end end def parse_mentions(text) do diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index 3969e92a6..f66238e0a 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -84,6 +84,12 @@ defmodule Pleroma.Web.TwitterAPI.Controller do |> send_resp(200, response) end + def upload_json(conn, %{"media" => media}) do + response = TwitterAPI.upload(media, "json") + conn + |> json_reply(200, response) + end + def config(conn, _params) do response = %{ site: %{ -- cgit v1.2.3 From 03ddaead7e01d096cc3caa95a956d049be2e28f6 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Fri, 14 Apr 2017 17:13:51 +0200 Subject: Add basic user caching. Expires after 5 seconds. --- lib/pleroma/application.ex | 4 ++++ lib/pleroma/user.ex | 13 +++++++++++++ lib/pleroma/web/twitter_api/twitter_api.ex | 13 +++++++++---- 3 files changed, 26 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index e88a85196..e5bd17ced 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -14,6 +14,10 @@ defmodule Pleroma.Application do supervisor(Pleroma.Web.Endpoint, []), # Start your own worker by calling: Pleroma.Worker.start_link(arg1, arg2, arg3) # worker(Pleroma.Worker, [arg1, arg2, arg3]), + supervisor(ConCache, [[ + ttl_check: :timer.seconds(1), + ttl: :timer.seconds(5) + ], [name: :users]]) ] # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index c77704db0..0a443d22a 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -52,4 +52,17 @@ defmodule Pleroma.User do def following?(%User{} = follower, %User{} = followed) do Enum.member?(follower.following, User.ap_followers(followed)) end + + def get_cached_by_ap_id(ap_id) do + ConCache.get_or_store(:users, "ap_id:#{ap_id}", fn() -> + # Return false so the cache will store it. + Repo.get_by(User, ap_id: ap_id) || false + end) + end + + def get_cached_by_nickname(nickname) do + ConCache.get_or_store(:users, "nickname:#{nickname}", fn() -> + Repo.get_by(User, nickname: nickname) || false + end) + end end diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 19f3c1c8c..d6ef0f4ed 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -175,7 +175,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do Regex.scan(regex, text) |> List.flatten |> Enum.uniq - |> Enum.map(fn ("@" <> match = full_match) -> {full_match, Repo.get_by(User, nickname: match)} end) + |> Enum.map(fn ("@" <> match = full_match) -> {full_match, User.get_cached_by_nickname(match)} end) |> Enum.filter(fn ({_match, user}) -> user end) end @@ -205,7 +205,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do # For likes, fetch the liked activity, too. defp activity_to_status(%Activity{data: %{"type" => "Like"}} = activity, opts) do actor = get_in(activity.data, ["actor"]) - user = Repo.get_by!(User, ap_id: actor) + user = User.get_cached_by_ap_id(actor) [liked_activity] = Activity.all_by_object_ap_id(activity.data["object"]) ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, liked_activity: liked_activity})) @@ -213,8 +213,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do defp activity_to_status(activity, opts) do actor = get_in(activity.data, ["actor"]) - user = Repo.get_by!(User, ap_id: actor) - mentioned_users = Repo.all(from user in User, where: user.ap_id in ^activity.data["to"]) + user = User.get_cached_by_ap_id(actor) + # mentioned_users = Repo.all(from user in User, where: user.ap_id in ^activity.data["to"]) + mentioned_users = Enum.map(activity.data["to"], fn (ap_id) -> + User.get_cached_by_ap_id(ap_id) + end) + |> Enum.filter(&(&1)) + ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, mentioned: mentioned_users})) end -- cgit v1.2.3 From 8c2aad1cabfc708084585a4f4afdccc481657d0e Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Fri, 14 Apr 2017 17:29:27 +0200 Subject: Make new users follow themselves. --- lib/mix/tasks/register_user.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/mix/tasks/register_user.ex b/lib/mix/tasks/register_user.ex index e2f36c34c..17535f190 100644 --- a/lib/mix/tasks/register_user.ex +++ b/lib/mix/tasks/register_user.ex @@ -14,7 +14,7 @@ defmodule Mix.Tasks.RegisterUser do bio: bio } - user = %{ user | ap_id: User.ap_id(user) } + user = %{ user | ap_id: User.ap_id(user), following: User.ap_followers(user) } Repo.insert!(user) end -- cgit v1.2.3 From a926038cd096d3340749f071a183c46a987e8c77 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Fri, 14 Apr 2017 18:08:47 +0200 Subject: Add unliking to activitypub. --- lib/pleroma/web/activity_pub/activity_pub.ex | 48 +++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index b9ba72b0d..75de2e43c 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -24,7 +24,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do # There's already a like here, so return the original activity. ap_id in (object.data["likes"] || []) -> query = from activity in Activity, - where: fragment("? @> ?", activity.data, ^%{actor: ap_id, object: id}) + where: fragment("? @> ?", activity.data, ^%{actor: ap_id, object: id, type: "Like"}) activity = Repo.one(query) {:ok, activity, object} @@ -47,17 +47,49 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do changeset = Ecto.Changeset.change(object, data: new_data) {:ok, object} = Repo.update(changeset) - # Update activities that already had this. Could be done in a seperate process. - relevant_activities = Activity.all_by_object_ap_id(id) - Enum.map(relevant_activities, fn (activity) -> - new_activity_data = activity.data |> Map.put("object", new_data) - changeset = Ecto.Changeset.change(activity, data: new_activity_data) - Repo.update(changeset) - end) + update_object_in_activities(object) + {:ok, activity, object} end end + defp update_object_in_activities(%{data: %{"id" => id}} = object) do + # Update activities that already had this. Could be done in a seperate process. + relevant_activities = Activity.all_by_object_ap_id(id) + Enum.map(relevant_activities, fn (activity) -> + new_activity_data = activity.data |> Map.put("object", object.data) + changeset = Ecto.Changeset.change(activity, data: new_activity_data) + Repo.update(changeset) + end) + end + + def unlike(%User{ap_id: ap_id} = user, %Object{data: %{ "id" => id}} = object) do + query = from activity in Activity, + where: fragment("? @> ?", activity.data, ^%{actor: ap_id, object: id, type: "Like"}) + + activity = Repo.one(query) + + if activity do + # just delete for now... + {:ok, _activity} = Repo.delete(activity) + + likes = (object.data["likes"] || []) |> List.delete(ap_id) + + new_data = object.data + |> Map.put("like_count", length(likes)) + |> Map.put("likes", likes) + + changeset = Ecto.Changeset.change(object, data: new_data) + {:ok, object} = Repo.update(changeset) + + update_object_in_activities(object) + + {:ok, object} + else + {:ok, object} + end + end + def generate_activity_id do generate_id("activities") end -- cgit v1.2.3 From f4eea0847b4bfcc2a2e6e0c80480ca5818f17aa9 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Fri, 14 Apr 2017 18:15:15 +0200 Subject: Add unfavoriting to TwAPI. --- lib/pleroma/web/twitter_api/twitter_api.ex | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index d6ef0f4ed..a23f465d4 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -137,6 +137,19 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do {:ok, status} end + def unfavorite(%User{} = user, %Activity{data: %{"object" => object}} = activity) do + object = Object.get_by_ap_id(object["id"]) + + {:ok, object} = ActivityPub.unlike(user, object) + new_data = activity.data + |> Map.put("object", object.data) + + status = %{activity | data: new_data} + |> activity_to_status(%{for: user}) + + {:ok, status} + end + def upload(%Plug.Upload{} = file, format \\ "xml") do {:ok, object} = ActivityPub.upload(file) -- cgit v1.2.3 From c83f279a7d1d9061dff6fb2f3f36740abad2e85c Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Fri, 14 Apr 2017 18:27:17 +0200 Subject: Add unliking to TwAPI controller. --- lib/pleroma/web/router.ex | 1 + lib/pleroma/web/twitter_api/twitter_api_controller.ex | 9 +++++++++ 2 files changed, 10 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index e11086538..7e4866c2f 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -42,5 +42,6 @@ defmodule Pleroma.Web.Router do post "/media/upload", TwitterAPI.Controller, :upload_json post "/favorites/create/:id", TwitterAPI.Controller, :favorite post "/favorites/create", TwitterAPI.Controller, :favorite + post "/favorites/destroy/:id", TwitterAPI.Controller, :unfavorite end end diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index f66238e0a..c71c123b2 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -113,6 +113,15 @@ defmodule Pleroma.Web.TwitterAPI.Controller do |> json_reply(200, response) end + def unfavorite(%{assigns: %{user: user}} = conn, %{"id" => id}) do + activity = Repo.get(Activity, id) + {:ok, status} = TwitterAPI.unfavorite(user, activity) + response = Poison.encode!(status) + + conn + |> json_reply(200, response) + end + defp json_reply(conn, status, json) do conn |> put_resp_content_type("application/json") -- cgit v1.2.3 From 7a47afed3c52f537e9a4851372d76ccf95459799 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Fri, 14 Apr 2017 18:59:11 +0200 Subject: Update object correctly after setting context. --- lib/pleroma/web/twitter_api/twitter_api.ex | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index a23f465d4..76dbc77a1 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -204,6 +204,11 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do |> put_in(["object", "statusnetConversationId"], activity.id) |> put_in(["statusnetConversationId"], activity.id) + object = Object.get_by_ap_id(activity.data["object"]["id"]) + + changeset = Ecto.Changeset.change(object, data: data["object"]) + Repo.update(changeset) + changeset = Ecto.Changeset.change(activity, data: data) Repo.update(changeset) end -- cgit v1.2.3 From 21c397820f5feffc5d68ccfb578e2d6765052a3b Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sat, 15 Apr 2017 12:11:20 +0200 Subject: Add announcements to activitypub. --- lib/pleroma/web/activity_pub/activity_pub.ex | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 75de2e43c..a38f63b03 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -137,6 +137,30 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |> Enum.reverse end + def announce(%User{ap_id: ap_id} = user, %Object{data: %{"id" => id}} = object) do + data = %{ + "type" => "Announce", + "actor" => ap_id, + "object" => id, + "to" => [User.ap_followers(user)] + } + + {:ok, activity} = insert(data) + + announcements = [ap_id | (object.data["announcements"] || [])] |> Enum.uniq + + new_data = object.data + |> Map.put("announcement_count", length(announcements)) + |> Map.put("announcements", announcements) + + changeset = Ecto.Changeset.change(object, data: new_data) + {:ok, object} = Repo.update(changeset) + + update_object_in_activities(object) + + {:ok, activity, object} + end + def fetch_activities_for_context(context) do query = from activity in Activity, where: fragment("? @> ?", activity.data, ^%{ context: context }) -- cgit v1.2.3 From 60c60de330fe8fe03594da89831351099c8c9037 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sat, 15 Apr 2017 13:54:46 +0200 Subject: Add announcements / retweets to TwAPI. --- lib/pleroma/web/activity_pub/activity_pub.ex | 2 +- .../representers/activity_representer.ex | 32 +++++++++++++++++++++- lib/pleroma/web/twitter_api/twitter_api.ex | 23 ++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index a38f63b03..b2508de68 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -63,7 +63,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end) end - def unlike(%User{ap_id: ap_id} = user, %Object{data: %{ "id" => id}} = object) do + def unlike(%User{ap_id: ap_id}, %Object{data: %{ "id" => id}} = object) do query = from activity in Activity, where: fragment("? @> ?", activity.data, ^%{actor: ap_id, object: id, type: "Like"}) diff --git a/lib/pleroma/web/twitter_api/representers/activity_representer.ex b/lib/pleroma/web/twitter_api/representers/activity_representer.ex index e69a63e1d..f2bf93abb 100644 --- a/lib/pleroma/web/twitter_api/representers/activity_representer.ex +++ b/lib/pleroma/web/twitter_api/representers/activity_representer.ex @@ -4,6 +4,32 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do alias Pleroma.Activity + defp user_by_ap_id(user_list, ap_id) do + Enum.find(user_list, fn (%{ap_id: user_id}) -> ap_id == user_id end) + end + + def to_map(%Activity{data: %{"type" => "Announce", "actor" => actor}} = activity, %{users: users, announced_activity: announced_activity} = opts) do + user = user_by_ap_id(users, actor) + created_at = get_in(activity.data, ["published"]) + |> date_to_asctime + + text = "#{user.nickname} retweeted a status." + + announced_user = user_by_ap_id(users, announced_activity.data["actor"]) + retweeted_status = to_map(announced_activity, Map.merge(%{user: announced_user}, opts)) + %{ + "id" => activity.id, + "user" => UserRepresenter.to_map(user, opts), + "statusnet_html" => text, + "text" => text, + "is_local" => true, + "is_post_verb" => false, + "uri" => "tag:#{activity.data["id"]}:objectType=note", + "created_at" => created_at, + "retweeted_status" => retweeted_status + } + end + def to_map(%Activity{data: %{"type" => "Like"}} = activity, %{user: user, liked_activity: liked_activity} = opts) do created_at = get_in(activity.data, ["published"]) |> date_to_asctime @@ -45,7 +71,9 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do created_at = get_in(activity.data, ["object", "published"]) |> date_to_asctime like_count = get_in(activity.data, ["object", "like_count"]) || 0 + announcement_count = get_in(activity.data, ["object", "announcement_count"]) || 0 favorited = opts[:for] && opts[:for].ap_id in (activity.data["object"]["likes"] || []) + repeated = opts[:for] && opts[:for].ap_id in (activity.data["object"]["announcements"] || []) mentions = opts[:mentioned] || [] @@ -68,7 +96,9 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do "attachments" => (activity.data["object"]["attachment"] || []) |> ObjectRepresenter.enum_to_list(opts), "attentions" => attentions, "fave_num" => like_count, - "favorited" => !!favorited + "repeat_num" => announcement_count, + "favorited" => !!favorited, + "repeated" => !!repeated, } end diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 76dbc77a1..58f8bc1d3 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -150,6 +150,19 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do {:ok, status} end + def retweet(%User{} = user, %Activity{data: %{"object" => object}} = activity) do + object = Object.get_by_ap_id(object["id"]) + + {:ok, _announce_activity, object} = ActivityPub.announce(user, object) + new_data = activity.data + |> Map.put("object", object.data) + + status = %{activity | data: new_data} + |> activity_to_status(%{for: user}) + + {:ok, status} + end + def upload(%Plug.Upload{} = file, format \\ "xml") do {:ok, object} = ActivityPub.upload(file) @@ -229,6 +242,16 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, liked_activity: liked_activity})) end + # For announces, fetch the announced activity and the user. + defp activity_to_status(%Activity{data: %{"type" => "Announce"}} = activity, opts) do + actor = get_in(activity.data, ["actor"]) + user = User.get_cached_by_ap_id(actor) + [announced_activity] = Activity.all_by_object_ap_id(activity.data["object"]) + announced_actor = User.get_cached_by_ap_id(announced_activity.data["actor"]) + + ActivityRepresenter.to_map(activity, Map.merge(opts, %{users: [user, announced_actor], announced_activity: announced_activity})) + end + defp activity_to_status(activity, opts) do actor = get_in(activity.data, ["actor"]) user = User.get_cached_by_ap_id(actor) -- cgit v1.2.3 From 4799dc6991682489e8f1701946685a7725ad0a6a Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sat, 15 Apr 2017 14:09:54 +0200 Subject: Add retweeting to TwAPI controller. --- lib/pleroma/web/router.ex | 1 + lib/pleroma/web/twitter_api/twitter_api_controller.ex | 9 +++++++++ 2 files changed, 10 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 7e4866c2f..7bb3c9763 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -43,5 +43,6 @@ defmodule Pleroma.Web.Router do post "/favorites/create/:id", TwitterAPI.Controller, :favorite post "/favorites/create", TwitterAPI.Controller, :favorite post "/favorites/destroy/:id", TwitterAPI.Controller, :unfavorite + post "/statuses/retweet/:id", TwitterAPI.Controller, :retweet end end diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index c71c123b2..a4d8a1d14 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -122,6 +122,15 @@ defmodule Pleroma.Web.TwitterAPI.Controller do |> json_reply(200, response) end + def retweet(%{assigns: %{user: user}} = conn, %{"id" => id}) do + activity = Repo.get(Activity, id) + {:ok, status} = TwitterAPI.retweet(user, activity) + response = Poison.encode!(status) + + conn + |> json_reply(200, response) + end + defp json_reply(conn, status, json) do conn |> put_resp_content_type("application/json") -- cgit v1.2.3 From 4f7adb343c66dba0a3c6883cd9f4156fb43594d4 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sat, 15 Apr 2017 14:16:01 +0200 Subject: Address liking / announcing to the original author. --- lib/pleroma/web/activity_pub/activity_pub.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index b2508de68..0d3360ee1 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -33,7 +33,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do "type" => "Like", "actor" => ap_id, "object" => id, - "to" => [User.ap_followers(user)] + "to" => [User.ap_followers(user), object.data["actor"]] } {:ok, activity} = insert(data) @@ -142,7 +142,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do "type" => "Announce", "actor" => ap_id, "object" => id, - "to" => [User.ap_followers(user)] + "to" => [User.ap_followers(user), object.data["actor"]] } {:ok, activity} = insert(data) -- cgit v1.2.3 From 03c6148bb3dfe6efe512363d2793eb233e020d50 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sat, 15 Apr 2017 16:40:09 +0200 Subject: Add user registration changeset. --- lib/pleroma/user.ex | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 0a443d22a..ed85447fe 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -9,6 +9,8 @@ defmodule Pleroma.User do field :name, :string field :nickname, :string field :password_hash, :string + field :password, :string, virtual: true + field :password_confirmation, :string, virtual: true field :following, { :array, :string }, default: [] field :ap_id, :string @@ -29,6 +31,27 @@ defmodule Pleroma.User do |> validate_required([:following]) end + def register_changeset(struct, params \\ %{}) do + changeset = struct + |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation]) + |> validate_required([:bio, :email, :name, :nickname, :password, :password_confirmation]) + |> validate_confirmation(:password) + |> unique_constraint(:email) + |> unique_constraint(:nickname) + + if changeset.valid? do + hashed = Comeonin.Pbkdf2.hashpwsalt(changeset.changes[:password]) + ap_id = User.ap_id(%User{nickname: changeset.changes[:nickname]}) + followers = User.ap_followers(%User{nickname: changeset.changes[:nickname]}) + changeset + |> put_change(:password_hash, hashed) + |> put_change(:ap_id, ap_id) + |> put_change(:following, [followers]) + else + changeset + end + end + def follow(%User{} = follower, %User{} = followed) do ap_followers = User.ap_followers(followed) following = [ap_followers | follower.following] -- cgit v1.2.3 From 40706b4c4fe4ae29bf01ef13bc3e79318773d66f Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sat, 15 Apr 2017 16:42:02 +0200 Subject: Use changeset in user registration mix task. --- lib/mix/tasks/register_user.ex | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/mix/tasks/register_user.ex b/lib/mix/tasks/register_user.ex index 17535f190..48236439b 100644 --- a/lib/mix/tasks/register_user.ex +++ b/lib/mix/tasks/register_user.ex @@ -6,15 +6,17 @@ defmodule Mix.Tasks.RegisterUser do @shortdoc "Register user" def run([name, nickname, email, bio, password]) do ensure_started(Repo, []) - user = %User{ + + params = %{ name: name, nickname: nickname, email: email, - password_hash: Comeonin.Pbkdf2.hashpwsalt(password), + password: password, + password_confirmation: password, bio: bio } - user = %{ user | ap_id: User.ap_id(user), following: User.ap_followers(user) } + user = User.register_changeset(%User{}, params) Repo.insert!(user) end -- cgit v1.2.3 From b1edd94baa64a18223ae2cc731231ba4314fd0d3 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 16 Apr 2017 10:25:27 +0200 Subject: Add user registration to TwAPI. --- lib/pleroma/web/twitter_api/twitter_api.ex | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 58f8bc1d3..557faf454 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -1,7 +1,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do alias Pleroma.{User, Activity, Repo, Object} alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter + alias Pleroma.Web.TwitterAPI.Representers.{ActivityRepresenter, UserRepresenter} import Ecto.Query @@ -227,6 +227,28 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end end + def register_user(params) do + params = %{ + nickname: params["nickname"], + name: params["fullname"], + bio: params["bio"], + email: params["email"], + password: params["password"], + password_confirmation: params["confirm"] + } + + changeset = User.register_changeset(%User{}, params) + + with {:ok, user} <- Repo.insert(changeset) do + {:ok, UserRepresenter.to_map(user)} + else + {:error, changeset} -> + errors = Ecto.Changeset.traverse_errors(changeset, fn {msg, opts} -> msg end) + |> Poison.encode! + {:error, %{error: errors}} + end + end + defp activities_to_statuses(activities, opts) do Enum.map(activities, fn(activity) -> activity_to_status(activity, opts) -- cgit v1.2.3 From 5dac3727f10d65eea284da56fe4b0db5cab53f1f Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 16 Apr 2017 11:01:24 +0200 Subject: Add registration to the TwAPI controller. --- lib/pleroma/web/router.ex | 1 + lib/pleroma/web/twitter_api/twitter_api_controller.ex | 11 +++++++++++ 2 files changed, 12 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 7bb3c9763..2749be5e9 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -26,6 +26,7 @@ defmodule Pleroma.Web.Router do get "/statuses/show/:id", TwitterAPI.Controller, :fetch_status get "/statusnet/conversation/:id", TwitterAPI.Controller, :fetch_conversation get "/statusnet/config", TwitterAPI.Controller, :config + post "/account/register", TwitterAPI.Controller, :register end scope "/api", Pleroma.Web do diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index a4d8a1d14..fa26bb3e9 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -131,6 +131,17 @@ defmodule Pleroma.Web.TwitterAPI.Controller do |> json_reply(200, response) end + def register(conn, params) do + with {:ok, user} <- TwitterAPI.register_user(params) do + conn + |> json_reply(200, Poison.encode!(user)) + else + {:error, errors} -> + conn + |> json_reply(400, Poison.encode!(errors)) + end + end + defp json_reply(conn, status, json) do conn |> put_resp_content_type("application/json") -- cgit v1.2.3 From b41f3eff84e9ec496f0049cdd4fa9388a0fb7b5c Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 16 Apr 2017 11:51:00 +0200 Subject: Preserve newlines in messages. --- lib/pleroma/web/twitter_api/twitter_api.ex | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 557faf454..735d88832 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -13,6 +13,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do context = ActivityPub.generate_context_id content = HtmlSanitizeEx.strip_tags(data["status"]) + |> String.replace("\n", "
") mentions = parse_mentions(content) -- cgit v1.2.3