diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/web/ostatus/ostatus_controller.ex | 105 | 
1 files changed, 68 insertions, 37 deletions
| diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index de8567224..f346cc9af 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -9,36 +9,42 @@ defmodule Pleroma.Web.OStatus.OStatusController do    alias Pleroma.Web.ActivityPub.ActivityPubController    alias Pleroma.Web.ActivityPub.ActivityPub -  def feed_redirect(conn, %{"nickname" => nickname}) do -    user = User.get_cached_by_nickname(nickname) +  action_fallback(:errors) -    case get_format(conn) do -      "html" -> Fallback.RedirectController.redirector(conn, nil) -      "activity+json" -> ActivityPubController.call(conn, :user) -      _ -> redirect(conn, external: OStatus.feed_path(user)) +  def feed_redirect(conn, %{"nickname" => nickname}) do +    with {_, %User{} = user} <- {:user, User.get_cached_by_nickname(nickname)} do +      case get_format(conn) do +        "html" -> Fallback.RedirectController.redirector(conn, nil) +        "activity+json" -> ActivityPubController.call(conn, :user) +        _ -> redirect(conn, external: OStatus.feed_path(user)) +      end +    else +      {:user, nil} -> {:error, :not_found}      end    end    def feed(conn, %{"nickname" => nickname} = params) do -    user = User.get_cached_by_nickname(nickname) - -    query_params = -      Map.take(params, ["max_id"]) -      |> Map.merge(%{"whole_db" => true, "actor_id" => user.ap_id}) - -    activities = -      ActivityPub.fetch_public_activities(query_params) -      |> Enum.reverse() - -    response = -      user -      |> FeedRepresenter.to_simple_form(activities, [user]) -      |> :xmerl.export_simple(:xmerl_xml) -      |> to_string - -    conn -    |> put_resp_content_type("application/atom+xml") -    |> send_resp(200, response) +    with {_, %User{} = user} <- {:user, User.get_cached_by_nickname(nickname)} do +      query_params = +        Map.take(params, ["max_id"]) +        |> Map.merge(%{"whole_db" => true, "actor_id" => user.ap_id}) + +      activities = +        ActivityPub.fetch_public_activities(query_params) +        |> Enum.reverse() + +      response = +        user +        |> FeedRepresenter.to_simple_form(activities, [user]) +        |> :xmerl.export_simple(:xmerl_xml) +        |> to_string + +      conn +      |> put_resp_content_type("application/atom+xml") +      |> send_resp(200, response) +    else +      {:user, nil} -> {:error, :not_found} +    end    end    defp decode_or_retry(body) do @@ -73,7 +79,8 @@ defmodule Pleroma.Web.OStatus.OStatusController do        ActivityPubController.call(conn, :object)      else        with id <- o_status_url(conn, :object, uuid), -           %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id), +           {_, %Activity{} = activity} <- +             {:activity, Activity.get_create_activity_by_object_ap_id(id)},             {_, true} <- {:public?, ActivityPub.is_public?(activity)},             %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do          case get_format(conn) do @@ -82,16 +89,20 @@ defmodule Pleroma.Web.OStatus.OStatusController do          end        else          {:public?, false} -> -          conn -          |> put_status(404) -          |> json("Not found") +          {:error, :not_found} + +        {:activity, nil} -> +          {:error, :not_found} + +        e -> +          e        end      end    end    def activity(conn, %{"uuid" => uuid}) do      with id <- o_status_url(conn, :activity, uuid), -         %Activity{} = activity <- Activity.get_by_ap_id(id), +         {_, %Activity{} = activity} <- {:activity, Activity.get_by_ap_id(id)},           {_, true} <- {:public?, ActivityPub.is_public?(activity)},           %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do        case get_format(conn) do @@ -100,14 +111,18 @@ defmodule Pleroma.Web.OStatus.OStatusController do        end      else        {:public?, false} -> -        conn -        |> put_status(404) -        |> json("Not found") +        {:error, :not_found} + +      {:activity, nil} -> +        {:error, :not_found} + +      e -> +        e      end    end    def notice(conn, %{"id" => id}) do -    with %Activity{} = activity <- Repo.get(Activity, id), +    with {_, %Activity{} = activity} <- {:activity, Repo.get(Activity, id)},           {_, true} <- {:public?, ActivityPub.is_public?(activity)},           %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do        case get_format(conn) do @@ -121,9 +136,13 @@ defmodule Pleroma.Web.OStatus.OStatusController do        end      else        {:public?, false} -> -        conn -        |> put_status(404) -        |> json("Not found") +        {:error, :not_found} + +      {:activity, nil} -> +        {:error, :not_found} + +      e -> +        e      end    end @@ -139,4 +158,16 @@ defmodule Pleroma.Web.OStatus.OStatusController do      |> put_resp_content_type("application/atom+xml")      |> send_resp(200, response)    end + +  def errors(conn, {:error, :not_found}) do +    conn +    |> put_status(404) +    |> text("Not found") +  end + +  def errors(conn, _) do +    conn +    |> put_status(500) +    |> text("Something went wrong") +  end  end | 
