From 1e88f102c49fb0a41f17f2c7f5161237e28b8baf Mon Sep 17 00:00:00 2001 From: Roger Braun 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 @@ def follow_changeset(struct, params \\ %{}) 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 @@ def to_map(user, opts) do false end + user_info = User.user_info(user) + map = %{ "id" => user.id, "name" => user.name, @@ -23,9 +25,9 @@ def to_map(user, opts) 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 @@ test "A user with an avatar object", %{user: user} 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 @@ test "A user", %{user: user} 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 @@ test "A user for a given other follower", %{user: user} 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 @@ test "it returns errors on a problem", %{conn: conn} do end defp valid_user(_context) do - { :ok, user } = UserBuilder.insert(%{nickname: "lambda", ap_id: "lambda"}) + user = insert(:user) [user: user] end