Add Twitter API verify_credentials endpoint.
authorRoger Braun <roger@rogerbraun.net>
Mon, 20 Mar 2017 20:30:44 +0000 (21:30 +0100)
committerRoger Braun <roger@rogerbraun.net>
Mon, 20 Mar 2017 20:30:44 +0000 (21:30 +0100)
lib/pleroma/web/router.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex [new file with mode: 0644]
test/web/twitter_api/twitter_api_controller_test.exs [new file with mode: 0644]

index e0f1ac12f2f8f118c48cfa294905d09551d199d6..83e4253ce9e532204ccc7e28e5e627a5f58c8a66 100644 (file)
@@ -1,11 +1,25 @@
 defmodule Pleroma.Web.Router do
   use Pleroma.Web, :router
 
+  alias Pleroma.{Repo, User}
+
+  def user_fetcher(username) do
+    {:ok, Repo.get_by(User, %{nickname: username})}
+  end
+
   pipeline :api do
     plug :accepts, ["json"]
   end
 
+  pipeline :authenticated_api do
+    plug :accepts, ["json"]
+    plug :fetch_session
+    plug Pleroma.Plugs.AuthenticationPlug, fetcher: &Pleroma.Web.Router.user_fetcher/1
+  end
+
   scope "/api", Pleroma.Web do
-    pipe_through :api
+    pipe_through :authenticated_api
+
+    post "/account/verify_credentials.json", TwitterAPI.Controller, :verify_credentials
   end
 end
diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex
new file mode 100644 (file)
index 0000000..836013c
--- /dev/null
@@ -0,0 +1,18 @@
+defmodule Pleroma.Web.TwitterAPI.Controller do
+  use Pleroma.Web, :controller
+
+  alias Pleroma.Web.TwitterAPI.Representers.UserRepresenter
+
+  def verify_credentials(%{assigns: %{user: user}} = conn, _params) do
+    response = user |> UserRepresenter.to_json
+
+    conn
+    |> json_reply(200, response)
+  end
+
+  defp json_reply(conn, status, json) do
+    conn
+    |> put_resp_content_type("application/json")
+    |> send_resp(status, json)
+  end
+end
diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs
new file mode 100644 (file)
index 0000000..118ef93
--- /dev/null
@@ -0,0 +1,38 @@
+defmodule Pleroma.Web.TwitterAPI.ControllerTest do
+  use Pleroma.Web.ConnCase
+  alias Pleroma.{User, Repo}
+  alias Pleroma.Web.TwitterAPI.Representers.UserRepresenter
+
+  describe "POST /api/account/verify_credentials" do
+    setup [:valid_user]
+    test "without valid credentials", %{conn: conn} do
+      conn = post conn, "/api/account/verify_credentials.json"
+      assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
+    end
+
+    test "with credentials", %{conn: conn, user: user} do
+      conn = conn
+        |> with_credentials(user.nickname, "test")
+        |> post("/api/account/verify_credentials.json")
+
+      assert json_response(conn, 200) == UserRepresenter.to_map(user)
+    end
+  end
+
+  defp valid_user(_context) do
+    user = %User{
+      email: "test@example.org",
+      name: "Test Name",
+      nickname: "testname",
+      password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),
+      bio: "A tester."
+    }
+    user = Repo.insert!(user)
+    [user: user]
+  end
+
+  defp with_credentials(conn, username, password) do
+    header_content = "Basic " <> Base.encode64("#{username}:#{password}")
+    put_req_header(conn, "authorization", header_content)
+  end
+end