Merge branch 'feature/dynamic-user-refresh' into 'develop'
user: implement dynamic refresh of profiles See merge request pleroma/pleroma!350
This commit is contained in:
commit
4cb6331843
|
@ -1,28 +0,0 @@
|
||||||
defmodule Mix.Tasks.FixApUsers do
|
|
||||||
use Mix.Task
|
|
||||||
import Ecto.Query
|
|
||||||
alias Pleroma.{Repo, User}
|
|
||||||
|
|
||||||
@shortdoc "Grab all ap users again"
|
|
||||||
def run([]) do
|
|
||||||
Mix.Task.run("app.start")
|
|
||||||
|
|
||||||
q =
|
|
||||||
from(
|
|
||||||
u in User,
|
|
||||||
where: fragment("? @> ?", u.info, ^%{"ap_enabled" => true}),
|
|
||||||
where: u.local == false
|
|
||||||
)
|
|
||||||
|
|
||||||
users = Repo.all(q)
|
|
||||||
|
|
||||||
Enum.each(users, fn user ->
|
|
||||||
try do
|
|
||||||
IO.puts("Fetching #{user.nickname}")
|
|
||||||
Pleroma.Web.ActivityPub.Transmogrifier.upgrade_user_from_ap_id(user.ap_id, false)
|
|
||||||
rescue
|
|
||||||
e -> IO.inspect(e)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -22,6 +22,7 @@ defmodule Pleroma.User do
|
||||||
field(:info, :map, default: %{})
|
field(:info, :map, default: %{})
|
||||||
field(:follower_address, :string)
|
field(:follower_address, :string)
|
||||||
field(:search_distance, :float, virtual: true)
|
field(:search_distance, :float, virtual: true)
|
||||||
|
field(:last_refreshed_at, :naive_datetime)
|
||||||
has_many(:notifications, Notification)
|
has_many(:notifications, Notification)
|
||||||
|
|
||||||
timestamps()
|
timestamps()
|
||||||
|
@ -112,8 +113,12 @@ def update_changeset(struct, params \\ %{}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def upgrade_changeset(struct, params \\ %{}) do
|
def upgrade_changeset(struct, params \\ %{}) do
|
||||||
|
params =
|
||||||
|
params
|
||||||
|
|> Map.put(:last_refreshed_at, NaiveDateTime.utc_now())
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|> cast(params, [:bio, :name, :info, :follower_address, :avatar])
|
|> cast(params, [:bio, :name, :info, :follower_address, :avatar, :last_refreshed_at])
|
||||||
|> unique_constraint(:nickname)
|
|> unique_constraint(:nickname)
|
||||||
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
|
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
|
||||||
|> validate_length(:bio, max: 5000)
|
|> validate_length(:bio, max: 5000)
|
||||||
|
@ -169,6 +174,16 @@ def register_changeset(struct, params \\ %{}) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def needs_update?(%User{local: true}), do: false
|
||||||
|
|
||||||
|
def needs_update?(%User{local: false, last_refreshed_at: nil}), do: true
|
||||||
|
|
||||||
|
def needs_update?(%User{local: false} = user) do
|
||||||
|
NaiveDateTime.diff(NaiveDateTime.utc_now(), user.last_refreshed_at) >= 86400
|
||||||
|
end
|
||||||
|
|
||||||
|
def needs_update?(_), do: true
|
||||||
|
|
||||||
def maybe_direct_follow(%User{} = follower, %User{info: info} = followed) do
|
def maybe_direct_follow(%User{} = follower, %User{info: info} = followed) do
|
||||||
user_config = Application.get_env(:pleroma, :user)
|
user_config = Application.get_env(:pleroma, :user)
|
||||||
deny_follow_blocked = Keyword.get(user_config, :deny_follow_blocked)
|
deny_follow_blocked = Keyword.get(user_config, :deny_follow_blocked)
|
||||||
|
@ -655,7 +670,9 @@ def delete(%User{} = user) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_or_fetch_by_ap_id(ap_id) do
|
def get_or_fetch_by_ap_id(ap_id) do
|
||||||
if user = get_by_ap_id(ap_id) do
|
user = get_by_ap_id(ap_id)
|
||||||
|
|
||||||
|
if !is_nil(user) and !User.needs_update?(user) do
|
||||||
user
|
user
|
||||||
else
|
else
|
||||||
ap_try = ActivityPub.make_user_from_ap_id(ap_id)
|
ap_try = ActivityPub.make_user_from_ap_id(ap_id)
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.UsersAddLastRefreshedAt do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:users) do
|
||||||
|
add :last_refreshed_at, :naive_datetime
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -166,6 +166,25 @@ test "returns nil for nonexistant local user" do
|
||||||
fetched_user = User.get_or_fetch_by_nickname("nonexistant")
|
fetched_user = User.get_or_fetch_by_nickname("nonexistant")
|
||||||
assert fetched_user == nil
|
assert fetched_user == nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "updates an existing user, if stale" do
|
||||||
|
a_week_ago = NaiveDateTime.add(NaiveDateTime.utc_now(), -604_800)
|
||||||
|
|
||||||
|
orig_user =
|
||||||
|
insert(
|
||||||
|
:user,
|
||||||
|
local: false,
|
||||||
|
nickname: "admin@mastodon.example.org",
|
||||||
|
ap_id: "http://mastodon.example.org/users/admin",
|
||||||
|
last_refreshed_at: a_week_ago
|
||||||
|
)
|
||||||
|
|
||||||
|
assert orig_user.last_refreshed_at == a_week_ago
|
||||||
|
|
||||||
|
user = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin")
|
||||||
|
|
||||||
|
refute user.last_refreshed_at == orig_user.last_refreshed_at
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns an ap_id for a user" do
|
test "returns an ap_id for a user" do
|
||||||
|
|
Loading…
Reference in New Issue