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
|> 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])
false
end
+ user_info = User.user_info(user)
+
map = %{
"id" => user.id,
"name" => user.name,
"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,
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 = %{
"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,
"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,
end
defp valid_user(_context) do
- { :ok, user } = UserBuilder.insert(%{nickname: "lambda", ap_id: "lambda"})
+ user = insert(:user)
[user: user]
end