Add following TwAPI endpoint.
This commit is contained in:
		
							parent
							
								
									e2e0cd75b7
								
							
						
					
					
						commit
						75e51b190d
					
				
					 7 changed files with 78 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
defmodule Pleroma.User do
 | 
			
		||||
  use Ecto.Schema
 | 
			
		||||
  alias Pleroma.User
 | 
			
		||||
  import Ecto.Changeset
 | 
			
		||||
  alias Pleroma.{Repo, User}
 | 
			
		||||
 | 
			
		||||
  schema "users" do
 | 
			
		||||
    field :bio, :string
 | 
			
		||||
| 
						 | 
				
			
			@ -26,4 +27,20 @@ def ap_id(%User{nickname: nickname}) do
 | 
			
		|||
  def ap_followers(%User{} = user) do
 | 
			
		||||
    "#{ap_id(user)}/followers"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def follow_changeset(struct, params \\ %{}) do
 | 
			
		||||
    struct
 | 
			
		||||
    |> cast(params, [:following])
 | 
			
		||||
    |> validate_required([:following])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def follow(%User{} = follower, %User{} = followed) do
 | 
			
		||||
    ap_followers = User.ap_followers(followed)
 | 
			
		||||
    following = [ap_followers | follower.following]
 | 
			
		||||
    |> Enum.uniq
 | 
			
		||||
 | 
			
		||||
    follower
 | 
			
		||||
    |> follow_changeset(%{following: following})
 | 
			
		||||
    |> Repo.update
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,5 +31,6 @@ def user_fetcher(username) do
 | 
			
		|||
    post "/account/verify_credentials.json", TwitterAPI.Controller, :verify_credentials
 | 
			
		||||
    post "/statuses/update.json", TwitterAPI.Controller, :status_update
 | 
			
		||||
    get "/statuses/friends_timeline.json", TwitterAPI.Controller, :friends_timeline
 | 
			
		||||
    post "/friendships/create.json", TwitterAPI.Controller, :follow
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,14 @@ def fetch_public_statuses(opts \\ %{}) do
 | 
			
		|||
    |> activities_to_statuses
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def follow(%User{} = follower, followed_id) do
 | 
			
		||||
    with %User{} = followed <- Repo.get(User, followed_id),
 | 
			
		||||
         { :ok, follower } <- User.follow(follower, followed)
 | 
			
		||||
    do
 | 
			
		||||
      { :ok, follower, followed }
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp activities_to_statuses(activities) do
 | 
			
		||||
    Enum.map(activities, fn(activity) ->
 | 
			
		||||
      actor = get_in(activity.data, ["actor"])
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,15 @@ def friends_timeline(%{assigns: %{user: user}} = conn, params) do
 | 
			
		|||
    |> json_reply(200, json)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def follow(%{assigns: %{user: user}} = conn, %{ "user_id" => followed_id }) do
 | 
			
		||||
    { :ok, _user, follower } = TwitterAPI.follow(user, followed_id)
 | 
			
		||||
 | 
			
		||||
    response = follower |> UserRepresenter.to_json
 | 
			
		||||
 | 
			
		||||
    conn
 | 
			
		||||
    |> json_reply(200, response)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp json_reply(conn, status, json) do
 | 
			
		||||
    conn
 | 
			
		||||
    |> put_resp_content_type("application/json")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,4 +23,15 @@ test "ap_followers returns the followers collection for the user" do
 | 
			
		|||
 | 
			
		||||
    assert expected_followers_collection == User.ap_followers(user)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  test "follow takes a user and an id and tries to follow another user" do
 | 
			
		||||
    { :ok, user } = UserBuilder.insert
 | 
			
		||||
    { :ok, following } = UserBuilder.insert(%{nickname: "guy"})
 | 
			
		||||
 | 
			
		||||
    {:ok, user } = User.follow(user, following)
 | 
			
		||||
 | 
			
		||||
    user = Repo.get(User, user.id)
 | 
			
		||||
 | 
			
		||||
    assert user.following == [User.ap_followers(following)]
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,6 +79,26 @@ test "with credentials", %{conn: conn, user: current_user} do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe "POST /friendships/create.json" do
 | 
			
		||||
    setup [:valid_user]
 | 
			
		||||
    test "without valid credentials", %{conn: conn} do
 | 
			
		||||
      conn = post conn, "/api/friendships/create.json"
 | 
			
		||||
      assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    test "with credentials", %{conn: conn, user: current_user} do
 | 
			
		||||
      {:ok, followed } = UserBuilder.insert(%{name: "some guy"})
 | 
			
		||||
 | 
			
		||||
      conn = conn
 | 
			
		||||
      |> with_credentials(current_user.nickname, "test")
 | 
			
		||||
      |> post("/api/friendships/create.json", %{user_id: followed.id})
 | 
			
		||||
 | 
			
		||||
      current_user = Repo.get(User, current_user.id)
 | 
			
		||||
      assert current_user.following == [User.ap_followers(followed)]
 | 
			
		||||
      assert json_response(conn, 200) == UserRepresenter.to_map(followed)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp valid_user(_context) do
 | 
			
		||||
    { :ok, user } = UserBuilder.insert(%{nickname: "lambda", ap_id: "lambda"})
 | 
			
		||||
    [user: user]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,4 +40,15 @@ test "fetch friends' statuses" do
 | 
			
		|||
    assert length(statuses) == 1
 | 
			
		||||
    assert Enum.at(statuses, 0) == ActivityRepresenter.to_map(activity, %{user: activity_user})
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  test "Follow another user" do
 | 
			
		||||
    { :ok, user } = UserBuilder.insert
 | 
			
		||||
    { :ok, following } = UserBuilder.insert(%{nickname: "guy"})
 | 
			
		||||
 | 
			
		||||
    {:ok, user, following } = TwitterAPI.follow(user, following.id)
 | 
			
		||||
 | 
			
		||||
    user = Repo.get(User, user.id)
 | 
			
		||||
 | 
			
		||||
    assert user.following == [User.ap_followers(following)]
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue