From 1e88f102c49fb0a41f17f2c7f5161237e28b8baf Mon Sep 17 00:00:00 2001
From: Roger Braun <roger@rogerbraun.net>
Date: Fri, 21 Apr 2017 00:51:09 +0200
Subject: [PATCH] Fix specs, add some user info.

---
 lib/pleroma/user.ex                           | 19 ++++++++++++++++-
 .../representers/user_representer.ex          |  8 ++++---
 .../representers/user_representer_test.exs    | 21 ++++++++++++++-----
 .../twitter_api_controller_test.exs           |  2 +-
 4 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 86b4b8b5e..3a4dd5d08 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -1,7 +1,8 @@
 defmodule Pleroma.User do
   use Ecto.Schema
   import Ecto.Changeset
-  alias Pleroma.{Repo, User}
+  import Ecto.Query
+  alias Pleroma.{Repo, User, Activity, Object}
 
   schema "users" do
     field :bio, :string
@@ -32,6 +33,22 @@ defmodule Pleroma.User do
     |> validate_required([:following])
   end
 
+  def user_info(%User{} = user) do
+    note_count_query = from a in Object,
+      where: fragment("? @> ?", a.data, ^%{actor: user.ap_id, type: "Note"}),
+      select: count(a.id)
+
+    follower_count_query = from u in User,
+      where: fragment("? @> ?", u.following, ^User.ap_followers(user)),
+      select: count(u.id)
+
+    %{
+      following_count: length(user.following),
+      note_count: Repo.one(note_count_query),
+      follower_count: Repo.one(follower_count_query)
+    }
+  end
+
   def register_changeset(struct, params \\ %{}) do
     changeset = struct
     |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation])
diff --git a/lib/pleroma/web/twitter_api/representers/user_representer.ex b/lib/pleroma/web/twitter_api/representers/user_representer.ex
index 2ee4ee254..f358baf3c 100644
--- a/lib/pleroma/web/twitter_api/representers/user_representer.ex
+++ b/lib/pleroma/web/twitter_api/representers/user_representer.ex
@@ -15,6 +15,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenter do
       false
     end
 
+    user_info = User.user_info(user)
+
     map = %{
       "id" => user.id,
       "name" => user.name,
@@ -23,9 +25,9 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenter do
       "following" => following,
       # Fake fields
       "favourites_count" => 0,
-      "statuses_count" => 0,
-      "friends_count" => 0,
-      "followers_count" => 0,
+      "statuses_count" => user_info[:note_count],
+      "friends_count" => user_info[:following_count],
+      "followers_count" => user_info[:follower_count],
       "profile_image_url" => image,
       "profile_image_url_https" => image,
       "profile_image_url_profile_size" => image,
diff --git a/test/web/twitter_api/representers/user_representer_test.exs b/test/web/twitter_api/representers/user_representer_test.exs
index 913d1322c..1e92c5190 100644
--- a/test/web/twitter_api/representers/user_representer_test.exs
+++ b/test/web/twitter_api/representers/user_representer_test.exs
@@ -19,7 +19,18 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenterTest do
     assert represented["profile_image_url"] == image
   end
 
-  test "A user", %{user: user} do
+  test "A user" do
+    note_activity = insert(:note_activity)
+    user = User.get_cached_by_ap_id(note_activity.data["actor"])
+    follower = insert(:user)
+    second_follower = insert(:user)
+
+    User.follow(follower, user)
+    User.follow(second_follower, user)
+    User.follow(user, follower)
+
+    user = Repo.get!(User, user.id)
+
     image = "https://placehold.it/48x48"
 
     represented = %{
@@ -29,9 +40,9 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenterTest do
       "description" => user.bio,
       # Fake fields
       "favourites_count" => 0,
-      "statuses_count" => 0,
-      "friends_count" => 0,
-      "followers_count" => 0,
+      "statuses_count" => 1,
+      "friends_count" => 1,
+      "followers_count" => 2,
       "profile_image_url" => image,
       "profile_image_url_https" => image,
       "profile_image_url_profile_size" => image,
@@ -55,7 +66,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenterTest do
       "favourites_count" => 0,
       "statuses_count" => 0,
       "friends_count" => 0,
-      "followers_count" => 0,
+      "followers_count" => 1,
       "profile_image_url" => image,
       "profile_image_url_https" => image,
       "profile_image_url_profile_size" => image,
diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs
index e4ed6cd54..0761d0566 100644
--- a/test/web/twitter_api/twitter_api_controller_test.exs
+++ b/test/web/twitter_api/twitter_api_controller_test.exs
@@ -367,7 +367,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
   end
 
   defp valid_user(_context) do
-    { :ok, user } = UserBuilder.insert(%{nickname: "lambda", ap_id: "lambda"})
+    user = insert(:user)
     [user: user]
   end