Merge branch 'fix/credo-issues' into 'develop'
authorkaniini <nenolod@gmail.com>
Sun, 10 Feb 2019 20:54:21 +0000 (20:54 +0000)
committerkaniini <nenolod@gmail.com>
Sun, 10 Feb 2019 20:54:21 +0000 (20:54 +0000)
Fix credo issues

See merge request pleroma/pleroma!786

1  2 
lib/pleroma/object.ex
lib/pleroma/user.ex
lib/pleroma/web/activity_pub/utils.ex
lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
lib/pleroma/web/twitter_api/twitter_api.ex

diff --combined lib/pleroma/object.ex
index 96079cf229a7e24af2d2ebb97f098ac06610840f,5f1fc801b592d70da0534fdb9defd34e99880758..dabb495364277fdd0299a5e185db8947f26fd8bc
@@@ -4,8 -4,15 +4,15 @@@
  
  defmodule Pleroma.Object do
    use Ecto.Schema
-   alias Pleroma.{Repo, Object, User, Activity, ObjectTombstone}
-   import Ecto.{Query, Changeset}
+   alias Pleroma.Repo
+   alias Pleroma.Object
+   alias Pleroma.User
+   alias Pleroma.Activity
+   alias Pleroma.ObjectTombstone
+   import Ecto.Query
+   import Ecto.Changeset
  
    schema "objects" do
      field(:data, :map)
      timestamps()
    end
  
 +  def insert_or_get(cng) do
 +    {_, data} = fetch_field(cng, :data)
 +    id = data["id"] || data[:id]
 +    key = "object:#{id}"
 +
 +    fetcher = fn _ ->
 +      with nil <- get_by_ap_id(id),
 +           {:ok, object} <- Repo.insert(cng) do
 +        {:commit, object}
 +      else
 +        %Object{} = object -> {:commit, object}
 +        e -> {:ignore, e}
 +      end
 +    end
 +
 +    with {state, object} when state in [:commit, :ok] <- Cachex.fetch(:object_cache, key, fetcher) do
 +      {:ok, object}
 +    end
 +  end
 +
    def create(data) do
      Object.change(%Object{}, %{data: data})
 -    |> Repo.insert()
 +    |> insert_or_get()
    end
  
    def change(struct, params \\ %{}) do
diff --combined lib/pleroma/user.ex
index 3610348876d6c2a0ee769dd40b64386fdfc2946c,b44ba12799a2de96583116771e4820da93fdf761..0060d966bd17289cdfe7fba93dd88acbc7f192a9
@@@ -5,13 -5,23 +5,23 @@@
  defmodule Pleroma.User do
    use Ecto.Schema
  
-   import Ecto.{Changeset, Query}
-   alias Pleroma.{Repo, User, Object, Web, Activity, Notification}
+   import Ecto.Changeset
+   import Ecto.Query
+   alias Pleroma.Repo
+   alias Pleroma.User
+   alias Pleroma.Object
+   alias Pleroma.Web
+   alias Pleroma.Activity
+   alias Pleroma.Notification
    alias Comeonin.Pbkdf2
    alias Pleroma.Formatter
    alias Pleroma.Web.CommonAPI.Utils, as: CommonUtils
-   alias Pleroma.Web.{OStatus, Websub, OAuth}
-   alias Pleroma.Web.ActivityPub.{Utils, ActivityPub}
+   alias Pleroma.Web.OStatus
+   alias Pleroma.Web.Websub
+   alias Pleroma.Web.OAuth
+   alias Pleroma.Web.ActivityPub.Utils
+   alias Pleroma.Web.ActivityPub.ActivityPub
  
    require Logger
  
      "#{ap_id(user)}/followers"
    end
  
 -  def follow_changeset(struct, params \\ %{}) do
 -    struct
 -    |> cast(params, [:following])
 -    |> validate_required([:following])
 -  end
 -
    def user_info(%User{} = user) do
      oneself = if user.local, do: 1, else: 0
  
    @doc "Inserts provided changeset, performs post-registration actions (confirmation email sending etc.)"
    def register(%Ecto.Changeset{} = changeset) do
      with {:ok, user} <- Repo.insert(changeset),
 -         {:ok, _} <- try_send_confirmation_email(user),
 -         {:ok, user} <- autofollow_users(user) do
 +         {:ok, user} <- autofollow_users(user),
 +         {:ok, _} <- try_send_confirmation_email(user) do
        {:ok, user}
      end
    end
      end
    end
  
 -  @doc "A mass follow for local users. Ignores blocks and has no side effects"
 +  @doc "A mass follow for local users. Respects blocks but does not create activities."
    @spec follow_all(User.t(), list(User.t())) :: {atom(), User.t()}
    def follow_all(follower, followeds) do
 -    followed_addresses = Enum.map(followeds, fn %{follower_address: fa} -> fa end)
 +    followed_addresses =
 +      followeds
 +      |> Enum.reject(fn %{ap_id: ap_id} -> ap_id in follower.info.blocks end)
 +      |> Enum.map(fn %{follower_address: fa} -> fa end)
  
      q =
        from(u in User,
index 134701e80597f95002fa79c9a0fdc95bdbf39e59,964e11c9d424caae12a43dff5e6c2d46157ad06c..da6cca4ddd4052b93013b8c0c3b30a4fd88002b0
@@@ -3,11 -3,19 +3,19 @@@
  # SPDX-License-Identifier: AGPL-3.0-only
  
  defmodule Pleroma.Web.ActivityPub.Utils do
-   alias Pleroma.{Repo, Web, Object, Activity, User, Notification}
+   alias Pleroma.Repo
+   alias Pleroma.Web
+   alias Pleroma.Object
+   alias Pleroma.Activity
+   alias Pleroma.User
+   alias Pleroma.Notification
    alias Pleroma.Web.Router.Helpers
    alias Pleroma.Web.Endpoint
-   alias Ecto.{Changeset, UUID}
+   alias Ecto.Changeset
+   alias Ecto.UUID
    import Ecto.Query
    require Logger
  
    @supported_object_types ["Article", "Note", "Video", "Page"]
      context = context || generate_id("contexts")
      changeset = Object.context_mapping(context)
  
 -    case Repo.insert(changeset) do
 -      {:ok, object} ->
 -        object
 -
 -      # This should be solved by an upsert, but it seems ecto
 -      # has problems accessing the constraint inside the jsonb.
 -      {:error, _} ->
 -        Object.get_cached_by_ap_id(context)
 +    with {:ok, object} <- Object.insert_or_get(changeset) do
 +      object
      end
    end
  
index 8c7df5b90bf839cf9431d34363c1a68e81050a5e,c38827165ae7495fac783cfbf62834b5881b82e8..f4867d05bd0c4de0e78d921be7eb06c1f2da8b5c
@@@ -5,10 -5,11 +5,11 @@@
  defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
    use Pleroma.Web, :controller
  
+   alias Pleroma.Config
+   alias Pleroma.Repo
    alias Pleroma.Stats
+   alias Pleroma.User
    alias Pleroma.Web
-   alias Pleroma.{User, Repo}
-   alias Pleroma.Config
    alias Pleroma.Web.ActivityPub.MRF
  
    plug(Pleroma.Web.FederatingPlug)
@@@ -32,7 -33,7 +33,7 @@@
  
    # returns a nodeinfo 2.0 map, since 2.1 just adds a repository field
    # under software.
-   def raw_nodeinfo() do
+   def raw_nodeinfo do
      instance = Application.get_env(:pleroma, :instance)
      media_proxy = Application.get_env(:pleroma, :media_proxy)
      suggestions = Application.get_env(:pleroma, :suggestions)
        Application.get_env(:pleroma, :mrf_simple)
        |> Enum.into(%{})
  
 +    # This horror is needed to convert regex sigils to strings
 +    mrf_keyword =
 +      Application.get_env(:pleroma, :mrf_keyword, [])
 +      |> Enum.map(fn {key, value} ->
 +        {key,
 +         Enum.map(value, fn
 +           {pattern, replacement} ->
 +             %{
 +               "pattern" =>
 +                 if not is_binary(pattern) do
 +                   inspect(pattern)
 +                 else
 +                   pattern
 +                 end,
 +               "replacement" => replacement
 +             }
 +
 +           pattern ->
 +             if not is_binary(pattern) do
 +               inspect(pattern)
 +             else
 +               pattern
 +             end
 +         end)}
 +      end)
 +      |> Enum.into(%{})
 +
      mrf_policies =
        MRF.get_policies()
        |> Enum.map(fn policy -> to_string(policy) |> String.split(".") |> List.last() end)
        Config.get([:mrf_user_allowlist], [])
        |> Enum.into(%{}, fn {k, v} -> {k, length(v)} end)
  
-     mrf_transparency = Keyword.get(instance, :mrf_transparency)
      federation_response =
-       if mrf_transparency do
+       if Keyword.get(instance, :mrf_transparency) do
          %{
            mrf_policies: mrf_policies,
            mrf_simple: mrf_simple,
 +          mrf_keyword: mrf_keyword,
            mrf_user_allowlist: mrf_user_allowlist,
            quarantined_instances: quarantined
          }
index ddd5c5cfbb1180a37fea74d16478fc2a13913529,db521a3ad09599568d52dc597c2b1e469e8dc6e4..162beb9be06b7ffb7f95b51efb434ed3d5d1871a
@@@ -3,8 -3,13 +3,13 @@@
  # SPDX-License-Identifier: AGPL-3.0-only
  
  defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
-   alias Pleroma.{UserInviteToken, User, Activity, Repo, Object}
-   alias Pleroma.{UserEmail, Mailer}
+   alias Pleroma.UserInviteToken
+   alias Pleroma.User
+   alias Pleroma.Activity
+   alias Pleroma.Repo
+   alias Pleroma.Object
+   alias Pleroma.UserEmail
+   alias Pleroma.Mailer
    alias Pleroma.Web.ActivityPub.ActivityPub
    alias Pleroma.Web.TwitterAPI.UserView
    alias Pleroma.Web.CommonAPI
      else
        _e ->
          changeset = Object.context_mapping(context)
 -
 -        case Repo.insert(changeset) do
 -          {:ok, %{id: id}} ->
 -            id
 -
 -          # This should be solved by an upsert, but it seems ecto
 -          # has problems accessing the constraint inside the jsonb.
 -          {:error, _} ->
 -            Object.get_cached_by_ap_id(context).id
 -        end
 +        {:ok, object} = Object.insert_or_get(changeset)
 +        object.id
      end
    end