diff options
author | dtluna <dtluna@openmailbox.org> | 2017-04-27 16:18:50 +0300 |
---|---|---|
committer | dtluna <dtluna@openmailbox.org> | 2017-04-27 16:18:50 +0300 |
commit | 6cf7c132282e612514af992c6dea0b03ee5b678d (patch) | |
tree | 638e04628e5eecd492d23fadcebf00a21b702448 /lib/pleroma/web/twitter_api | |
parent | fb5cebc1b5dcfd6af7fa1a81bc5b26275714fa26 (diff) | |
download | pleroma-6cf7c132282e612514af992c6dea0b03ee5b678d.tar.gz |
Refactor code to comply with credo suggestions
Diffstat (limited to 'lib/pleroma/web/twitter_api')
-rw-r--r-- | lib/pleroma/web/twitter_api/representers/activity_representer.ex | 67 | ||||
-rw-r--r-- | lib/pleroma/web/twitter_api/twitter_api.ex | 88 | ||||
-rw-r--r-- | lib/pleroma/web/twitter_api/twitter_api_controller.ex | 30 |
3 files changed, 100 insertions, 85 deletions
diff --git a/lib/pleroma/web/twitter_api/representers/activity_representer.ex b/lib/pleroma/web/twitter_api/representers/activity_representer.ex index f2bf93abb..b58572829 100644 --- a/lib/pleroma/web/twitter_api/representers/activity_representer.ex +++ b/lib/pleroma/web/twitter_api/representers/activity_representer.ex @@ -1,17 +1,17 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do use Pleroma.Web.TwitterAPI.Representers.BaseRepresenter alias Pleroma.Web.TwitterAPI.Representers.{UserRepresenter, ObjectRepresenter} - alias Pleroma.Activity - + alias Pleroma.{Activity, User} + alias Calendar.Strftime 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 + def to_map(%Activity{data: %{"type" => "Announce", "actor" => actor, "published" => created_at}} = 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 + created_at = created_at |> date_to_asctime text = "#{user.nickname} retweeted a status." @@ -30,16 +30,16 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do } 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 + def to_map(%Activity{data: %{"type" => "Like", "published" => created_at}} = activity, + %{user: user, liked_activity: liked_activity} = opts) do + created_at = created_at |> date_to_asctime text = "#{user.nickname} favorited a status." %{ "id" => activity.id, "user" => UserRepresenter.to_map(user, opts), - "statusnet_html" => text, # TODO: add summary + "statusnet_html" => text, "text" => text, "is_local" => true, "is_post_verb" => false, @@ -49,16 +49,17 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do } end - def to_map(%Activity{data: %{"type" => "Follow"}} = activity, %{user: user} = opts) do - created_at = get_in(activity.data, ["published"]) - |> date_to_asctime + def to_map(%Activity{data: %{"type" => "Follow", "published" => created_at, "object" => followed_id}} = activity, %{user: user} = opts) do + created_at = created_at |> date_to_asctime + followed = User.get_cached_by_ap_id(followed_id) + text = "#{user.nickname} started following #{followed.nickname}" %{ "id" => activity.id, "user" => UserRepresenter.to_map(user, opts), "attentions" => [], - "statusnet_html" => "", # TODO: add summary - "text" => "", + "statusnet_html" => text, + "text" => text, "is_local" => true, "is_post_verb" => false, "created_at" => created_at, @@ -66,14 +67,12 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do } end - def to_map(%Activity{} = activity, %{user: user} = opts) 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 - 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"] || []) + def to_map(%Activity{data: %{"object" => %{"content" => content} = object}} = activity, %{user: user} = opts) do + created_at = object["published"] |> date_to_asctime + like_count = object["like_count"] || 0 + announcement_count = object["announcement_count"] || 0 + favorited = opts[:for] && opts[:for].ap_id in (object["likes"] || []) + repeated = opts[:for] && opts[:for].ap_id in (object["announcements"] || []) mentions = opts[:mentioned] || [] @@ -91,22 +90,34 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do "is_local" => true, "is_post_verb" => true, "created_at" => created_at, - "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), + "in_reply_to_status_id" => object["inReplyToStatusId"], + "statusnet_conversation_id" => object["statusnetConversationId"], + "attachments" => (object["attachment"] || []) |> ObjectRepresenter.enum_to_list(opts), "attentions" => attentions, "fave_num" => like_count, "repeat_num" => announcement_count, - "favorited" => !!favorited, - "repeated" => !!repeated, + "favorited" => to_boolean(favorited), + "repeated" => to_boolean(repeated), } 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") + Strftime.strftime!(date, "%a %b %d %H:%M:%S %z %Y") else _e -> "" end end + + defp to_boolean(false) do + false + end + + defp to_boolean(nil) do + false + end + + defp to_boolean(_) do + true + end end diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index f2b2b4418..649936b76 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -1,19 +1,19 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do + alias Ecto.Changeset alias Pleroma.{User, Activity, Repo, Object} - alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.{ActivityPub.ActivityPub, Websub, OStatus} alias Pleroma.Web.TwitterAPI.Representers.{ActivityRepresenter, UserRepresenter} import Ecto.Query - def create_status(user = %User{}, data = %{}) do + def create_status(%User{} = user, %{} = data) do attachments = Enum.map(data["media_ids"] || [], fn (media_id) -> Repo.get(Object, media_id).data end) context = ActivityPub.generate_context_id - content = HtmlSanitizeEx.strip_tags(data["status"]) - |> String.replace("\n", "<br>") + content = data["status"] |> HtmlSanitizeEx.strip_tags |> String.replace("\n", "<br>") mentions = parse_mentions(content) @@ -40,10 +40,10 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do "context" => context, "attachment" => attachments, "actor" => user.ap_id - }, + }, "published" => date, "context" => context - } + } # Wire up reply info. activity = with inReplyToId when not is_nil(inReplyToId) <- data["in_reply_to_status_id"], @@ -67,34 +67,34 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do with {:ok, activity} <- ActivityPub.insert(activity) do {:ok, activity} = add_conversation_id(activity) - Pleroma.Web.Websub.publish(Pleroma.Web.OStatus.feed_path(user), user, activity) + Websub.publish(OStatus.feed_path(user), user, activity) {:ok, activity} end end def fetch_friend_statuses(user, opts \\ %{}) do - ActivityPub.fetch_activities([user.ap_id | user.following], opts) - |> activities_to_statuses(%{for: user}) + activities = ActivityPub.fetch_activities([user.ap_id | user.following], opts) + activities_to_statuses(activities, %{for: user}) end def fetch_public_statuses(user, opts \\ %{}) do - ActivityPub.fetch_public_activities(opts) - |> activities_to_statuses(%{for: user}) + activities = ActivityPub.fetch_public_activities(opts) + activities_to_statuses(activities, %{for: user}) end def fetch_user_statuses(user, opts \\ %{}) do - ActivityPub.fetch_activities([], opts) - |> activities_to_statuses(%{for: user}) + activities = ActivityPub.fetch_activities([], opts) + activities_to_statuses(activities, %{for: user}) end def fetch_mentions(user, opts \\ %{}) do - ActivityPub.fetch_activities([user.ap_id], opts) - |> activities_to_statuses(%{for: user}) + activities = ActivityPub.fetch_activities([user.ap_id], opts) + activities_to_statuses(activities, %{for: user}) end def fetch_conversation(user, id) do query = from activity in Activity, - where: fragment("? @> ?", activity.data, ^%{ statusnetConversationId: id}), + where: fragment("? @> ?", activity.data, ^%{statusnetConversationId: id}), limit: 1 with %Activity{} = activity <- Repo.one(query), @@ -116,26 +116,26 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end def follow(%User{} = follower, params) do - with { :ok, %User{} = followed } <- get_user(params), - { :ok, follower } <- User.follow(follower, followed), - { :ok, activity } <- ActivityPub.insert(%{ - "type" => "Follow", - "actor" => follower.ap_id, - "object" => followed.ap_id, - "published" => make_date() - }) + with {:ok, %User{} = followed} <- get_user(params), + {:ok, follower} <- User.follow(follower, followed), + {:ok, activity} <- ActivityPub.insert(%{ + "type" => "Follow", + "actor" => follower.ap_id, + "object" => followed.ap_id, + "published" => make_date() + }) do - { :ok, follower, followed, activity } + {:ok, follower, followed, activity} else err -> err end end def unfollow(%User{} = follower, params) do - with { :ok, %User{} = unfollowed } <- get_user(params), - { :ok, follower } <- User.unfollow(follower, unfollowed) + with {:ok, %User{} = unfollowed} <- get_user(params), + {:ok, follower} <- User.unfollow(follower, unfollowed) do - { :ok, follower, unfollowed} + {:ok, follower, unfollowed} else err -> err end @@ -207,7 +207,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do media_id_string: "#{object.id}}", media_url: href, size: 0 - } |> Poison.encode! + } |> Poison.encode! end end @@ -215,15 +215,18 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do # Modified from https://www.w3.org/TR/html5/forms.html#valid-e-mail-address regex = ~r/@[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@?[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*/ - Regex.scan(regex, text) + regex + |> Regex.scan(text) |> List.flatten |> Enum.uniq - |> Enum.map(fn ("@" <> match = full_match) -> {full_match, User.get_cached_by_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 def add_user_links(text, mentions) do - Enum.reduce(mentions, text, fn ({match, %User{ap_id: ap_id}}, text) -> String.replace(text, match, "<a href='#{ap_id}'>#{match}</a>") end) + Enum.reduce(mentions, text, fn ({match, %User{ap_id: ap_id}}, text) -> + String.replace(text, match, "<a href='#{ap_id}'>#{match}</a>") end) end defp add_conversation_id(activity) do @@ -236,10 +239,10 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do object = Object.get_by_ap_id(activity.data["object"]["id"]) - changeset = Ecto.Changeset.change(object, data: data["object"]) + changeset = Changeset.change(object, data: data["object"]) Repo.update(changeset) - changeset = Ecto.Changeset.change(activity, data: data) + changeset = Changeset.change(activity, data: data) Repo.update(changeset) end end @@ -252,7 +255,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do email: params["email"], password: params["password"], password_confirmation: params["confirm"] - } + } changeset = User.register_changeset(%User{}, params) @@ -260,22 +263,21 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do {:ok, UserRepresenter.to_map(user)} else {:error, changeset} -> - errors = Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end) - |> Poison.encode! + errors = Poison.encode!(Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)) {:error, %{error: errors}} end end def get_user(user \\ nil, params) do case params do - %{ "user_id" => user_id } -> + %{"user_id" => user_id} -> case target = Repo.get(User, user_id) do nil -> {:error, "No user with such user_id"} _ -> {:ok, target} end - %{ "screen_name" => nickname } -> + %{"screen_name" => nickname} -> case target = Repo.get_by(User, nickname: nickname) do nil -> {:error, "No user with such screen_name"} @@ -303,7 +305,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do 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})) + ActivityRepresenter.to_map(activity, + Map.merge(opts, %{user: user, liked_activity: liked_activity})) end # For announces, fetch the announced activity and the user. @@ -313,7 +316,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do [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})) + ActivityRepresenter.to_map(activity, + Map.merge(opts, %{users: [user, announced_actor], announced_activity: announced_activity})) end defp activity_to_status(activity, opts) do @@ -323,7 +327,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do mentioned_users = Enum.map(activity.data["to"] || [], fn (ap_id) -> User.get_cached_by_ap_id(ap_id) end) - |> Enum.filter(&(&1)) + mentioned_users = mentioned_users |> Enum.filter(&(&1)) ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, mentioned: mentioned_users})) end diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index b5b829ca0..bbfc04a6a 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -2,8 +2,9 @@ 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} + alias Pleroma.{Web, Repo, Activity} alias Pleroma.Web.ActivityPub.ActivityPub + alias Ecto.Changeset def verify_credentials(%{assigns: %{user: user}} = conn, _params) do response = user |> UserRepresenter.to_json(%{for: user}) @@ -15,7 +16,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do def status_update(%{assigns: %{user: user}} = conn, %{"status" => status_text} = status_data) do if status_text |> String.trim |> String.length != 0 do media_ids = extract_media_ids(status_data) - {:ok, activity} = TwitterAPI.create_status(user, Map.put(status_data, "media_ids", media_ids )) + {:ok, activity} = TwitterAPI.create_status(user, Map.put(status_data, "media_ids", media_ids)) conn |> json_reply(200, ActivityRepresenter.to_json(activity, %{user: user})) else @@ -79,34 +80,34 @@ defmodule Pleroma.Web.TwitterAPI.Controller do def follow(%{assigns: %{user: user}} = conn, params) do case TwitterAPI.follow(user, params) do - { :ok, user, followed, _activity } -> + {:ok, user, followed, _activity} -> response = followed |> UserRepresenter.to_json(%{for: user}) conn |> json_reply(200, response) - { :error, msg } -> forbidden_json_reply(conn, msg) + {:error, msg} -> forbidden_json_reply(conn, msg) end end def unfollow(%{assigns: %{user: user}} = conn, params) do case TwitterAPI.unfollow(user, params) do - { :ok, user, unfollowed, } -> + {:ok, user, unfollowed} -> response = unfollowed |> UserRepresenter.to_json(%{for: user}) conn |> json_reply(200, response) - { :error, msg } -> forbidden_json_reply(conn, msg) + {:error, msg} -> forbidden_json_reply(conn, msg) end end - def fetch_status(%{assigns: %{user: user}} = conn, %{ "id" => id }) do - response = TwitterAPI.fetch_status(user, id) |> Poison.encode! + def fetch_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do + response = Poison.encode!(TwitterAPI.fetch_status(user, id)) conn |> json_reply(200, response) end - def fetch_conversation(%{assigns: %{user: user}} = conn, %{ "id" => id }) do + def fetch_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do id = String.to_integer(id) - response = TwitterAPI.fetch_conversation(user, id) |> Poison.encode! + response = Poison.encode!(TwitterAPI.fetch_conversation(user, id)) conn |> json_reply(200, response) @@ -132,8 +133,8 @@ defmodule Pleroma.Web.TwitterAPI.Controller do def config(conn, _params) do response = %{ site: %{ - name: Pleroma.Web.base_url, - server: Pleroma.Web.base_url, + name: Web.base_url, + server: Web.base_url, textlimit: -1 } } @@ -188,11 +189,10 @@ defmodule Pleroma.Web.TwitterAPI.Controller do def update_avatar(%{assigns: %{user: user}} = conn, params) do {:ok, object} = ActivityPub.upload(params) - change = Ecto.Changeset.change(user, %{avatar: object.data}) + change = Changeset.change(user, %{avatar: object.data}) {:ok, user} = Repo.update(change) - response = UserRepresenter.to_map(user, %{for: user}) - |> Poison.encode! + response = Poison.encode!(UserRepresenter.to_map(user, %{for: user})) conn |> json_reply(200, response) |