Skip to content
Snippets Groups Projects
Commit 9ad045fd authored by lain's avatar lain
Browse files

Return user specific json for logged in users.

parent 30650e5b
No related branches found
No related tags found
No related merge requests found
......@@ -53,4 +53,8 @@ defmodule Pleroma.User do
|> follow_changeset(%{following: following})
|> Repo.update
end
def following?(%User{} = follower, %User{} = followed) do
Enum.member?(follower.following, User.ap_followers(followed))
end
end
......@@ -3,12 +3,12 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
alias Pleroma.Web.TwitterAPI.Representers.UserRepresenter
alias Pleroma.Activity
def to_map(%Activity{} = activity, %{user: user}) do
def to_map(%Activity{} = activity, %{user: user} = opts) do
content = get_in(activity.data, ["object", "content"])
published = get_in(activity.data, ["object", "published"])
%{
"id" => activity.id,
"user" => UserRepresenter.to_map(user),
"user" => UserRepresenter.to_map(user, opts),
"attentions" => [],
"statusnet_html" => content,
"text" => content,
......
defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenter do
use Pleroma.Web.TwitterAPI.Representers.BaseRepresenter
alias Pleroma.User
def to_map(user, opts \\ %{}) do
def to_map(user, options) do
image = "https://placehold.it/48x48"
following = if opts[:for] do
User.following?(opts[:for], user)
else
false
end
map = %{
"id" => user.id,
"name" => user.name,
"screen_name" => user.nickname,
"description" => user.bio,
"following" => false,
"following" => following,
# Fake fields
"favourites_count" => 0,
"statuses_count" => 0,
......
......@@ -26,12 +26,12 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
def fetch_friend_statuses(user, opts \\ %{}) do
ActivityPub.fetch_activities(user.following, opts)
|> activities_to_statuses
|> activities_to_statuses(%{for: user})
end
def fetch_public_statuses(opts \\ %{}) do
def fetch_public_statuses(user, opts \\ %{}) do
ActivityPub.fetch_public_activities(opts)
|> activities_to_statuses
|> activities_to_statuses(%{for: user})
end
def follow(%User{} = follower, followed_id) do
......@@ -50,11 +50,11 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
end
end
defp activities_to_statuses(activities) do
defp activities_to_statuses(activities, opts) do
Enum.map(activities, fn(activity) ->
actor = get_in(activity.data, ["actor"])
user = Repo.get_by!(User, ap_id: actor)
ActivityRepresenter.to_map(activity, %{user: user})
ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user}))
end)
end
end
......@@ -4,7 +4,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
alias Pleroma.Web.TwitterAPI.Representers.{UserRepresenter, ActivityRepresenter}
def verify_credentials(%{assigns: %{user: user}} = conn, _params) do
response = user |> UserRepresenter.to_json
response = user |> UserRepresenter.to_json(%{for: user})
conn
|> json_reply(200, response)
......@@ -16,8 +16,8 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
|> json_reply(200, ActivityRepresenter.to_json(activity, %{user: user}))
end
def public_timeline(conn, params) do
statuses = TwitterAPI.fetch_public_statuses(params)
def public_timeline(%{assigns: %{user: user}} = conn, params) do
statuses = TwitterAPI.fetch_public_statuses(user, params)
{:ok, json} = Poison.encode(statuses)
conn
......@@ -35,22 +35,21 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
def follow(%{assigns: %{user: user}} = conn, %{ "user_id" => followed_id }) do
{ :ok, _user, follower } = TwitterAPI.follow(user, followed_id)
response = follower |> UserRepresenter.to_json
response = follower |> UserRepresenter.to_json(%{for: user})
conn
|> json_reply(200, response)
end
def unfollow(%{assigns: %{user: user}} = conn, %{ "user_id" => followed_id }) do
{ :ok, _user, follower } = TwitterAPI.unfollow(user, followed_id)
{ :ok, user, follower } = TwitterAPI.unfollow(user, followed_id)
response = follower |> UserRepresenter.to_json
response = follower |> UserRepresenter.to_json(%{for: user})
conn
|> json_reply(200, response)
end
defp json_reply(conn, status, json) do
conn
|> put_resp_content_type("application/json")
......
......@@ -45,4 +45,12 @@ defmodule Pleroma.UserTest do
assert user.following == []
end
test "test if a user is following another user" do
{ :ok, followed } = UserBuilder.insert(%{nickname: "guy"})
{ :ok, user } = UserBuilder.insert(%{following: [User.ap_followers(followed)]})
assert User.following?(user, followed)
refute User.following?(followed, user)
end
end
......@@ -6,6 +6,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
test "an activity" do
{:ok, user} = UserBuilder.insert
{:ok, follower} = UserBuilder.insert(%{following: [User.ap_followers(user)]})
content = "Some content"
date = DateTime.utc_now() |> DateTime.to_iso8601
......@@ -30,7 +32,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
expected_status = %{
"id" => activity.id,
"user" => UserRepresenter.to_map(user),
"user" => UserRepresenter.to_map(user, %{for: follower}),
"is_local" => true,
"attentions" => [],
"statusnet_html" => content,
......@@ -39,6 +41,6 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
"created_at" => date
}
assert ActivityRepresenter.to_map(activity, %{user: user}) == expected_status
assert ActivityRepresenter.to_map(activity, %{user: user, for: follower}) == expected_status
end
end
......@@ -3,16 +3,10 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenterTest do
alias Pleroma.User
alias Pleroma.Web.TwitterAPI.Representers.UserRepresenter
alias Pleroma.Builders.UserBuilder
setup 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)
{:ok, user} = UserBuilder.insert
[user: user]
end
......@@ -38,4 +32,28 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenterTest do
assert represented == UserRepresenter.to_map(user)
end
test "A user for a given other follower", %{user: user} do
{:ok, follower} = UserBuilder.insert(%{following: [User.ap_followers(user)]})
image = "https://placehold.it/48x48"
represented = %{
"id" => user.id,
"name" => user.name,
"screen_name" => user.nickname,
"description" => user.bio,
# Fake fields
"favourites_count" => 0,
"statuses_count" => 0,
"friends_count" => 0,
"followers_count" => 0,
"profile_image_url" => image,
"profile_image_url_https" => image,
"profile_image_url_profile_size" => image,
"profile_image_url_original" => image,
"following" => true,
"rights" => %{}
}
assert represented == UserRepresenter.to_map(user, %{for: follower})
end
end
......@@ -62,7 +62,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
test "with credentials", %{conn: conn, user: current_user} do
{:ok, user} = UserBuilder.insert
activities = ActivityBuilder.insert_list(30, %{"to" => [User.ap_followers(user)]}, %{user: user})
ActivityBuilder.insert_list(10, %{"to" => [User.ap_followers(user)]}, %{user: user})
returned_activities = ActivityBuilder.insert_list(10, %{"to" => [User.ap_followers(user)]}, %{user: user})
{:ok, other_user} = UserBuilder.insert(%{ap_id: "glimmung", nickname: "nockame"})
ActivityBuilder.insert_list(10, %{}, %{user: other_user})
since_id = List.last(activities).id
......@@ -76,6 +76,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
response = json_response(conn, 200)
assert length(response) == 10
assert response == Enum.map(returned_activities, fn (activity) -> ActivityRepresenter.to_map(activity, %{user: user, for: current_user}) end)
end
end
......
......@@ -22,10 +22,12 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
test "fetch public statuses" do
%{ public: activity, user: user } = ActivityBuilder.public_and_non_public
statuses = TwitterAPI.fetch_public_statuses()
{:ok, follower } = UserBuilder.insert(%{name: "dude", ap_id: "idididid", following: [User.ap_followers(user)]})
statuses = TwitterAPI.fetch_public_statuses(follower)
assert length(statuses) == 1
assert Enum.at(statuses, 0) == ActivityRepresenter.to_map(activity, %{user: user})
assert Enum.at(statuses, 0) == ActivityRepresenter.to_map(activity, %{user: user, for: follower})
end
test "fetch friends' statuses" do
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment