forked from AkkomaGang/akkoma
Make TwAPI UserView more resilient to issues.
Will work for missing users and badly migrated users.
This commit is contained in:
parent
b0e8e521fb
commit
7382adf407
3 changed files with 52 additions and 1 deletions
|
@ -367,6 +367,15 @@ def get_by_ap_id(ap_id) do
|
||||||
Repo.get_by(User, ap_id: ap_id)
|
Repo.get_by(User, ap_id: ap_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# This is mostly an SPC migration fix. This guesses the user nickname (by taking the last part of the ap_id and the domain) and tries to get that user
|
||||||
|
def get_by_guessed_nickname(ap_id) do
|
||||||
|
domain = URI.parse(ap_id).host
|
||||||
|
name = List.last(String.split(ap_id, "/"))
|
||||||
|
nickname = "#{name}@#{domain}"
|
||||||
|
|
||||||
|
get_by_nickname(nickname)
|
||||||
|
end
|
||||||
|
|
||||||
def update_and_set_cache(changeset) do
|
def update_and_set_cache(changeset) do
|
||||||
with {:ok, user} <- Repo.update(changeset) do
|
with {:ok, user} <- Repo.update(changeset) do
|
||||||
Cachex.put(:user_cache, "ap_id:#{user.ap_id}", user)
|
Cachex.put(:user_cache, "ap_id:#{user.ap_id}", user)
|
||||||
|
|
|
@ -94,11 +94,25 @@ defp get_user(ap_id, opts) do
|
||||||
ap_id == "https://www.w3.org/ns/activitystreams#Public" ->
|
ap_id == "https://www.w3.org/ns/activitystreams#Public" ->
|
||||||
nil
|
nil
|
||||||
|
|
||||||
|
user = User.get_cached_by_ap_id(ap_id) ->
|
||||||
|
user
|
||||||
|
|
||||||
|
user = User.get_by_guessed_nickname(ap_id) ->
|
||||||
|
user
|
||||||
|
|
||||||
true ->
|
true ->
|
||||||
User.get_cached_by_ap_id(ap_id)
|
error_user()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp error_user do
|
||||||
|
%User{
|
||||||
|
info: %User.Info{},
|
||||||
|
nickname: "erroruser@example.com",
|
||||||
|
inserted_at: NaiveDateTime.utc_now()
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def render("index.json", opts) do
|
def render("index.json", opts) do
|
||||||
context_ids = collect_context_ids(opts.activities)
|
context_ids = collect_context_ids(opts.activities)
|
||||||
users = collect_users(opts.activities)
|
users = collect_users(opts.activities)
|
||||||
|
|
|
@ -25,6 +25,34 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
|
||||||
|
|
||||||
import Mock
|
import Mock
|
||||||
|
|
||||||
|
test "returns an error user for activities missing users" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"})
|
||||||
|
|
||||||
|
Repo.delete(user)
|
||||||
|
Cachex.clear(:user_cache)
|
||||||
|
|
||||||
|
result = ActivityView.render("activity.json", activity: activity)
|
||||||
|
assert result
|
||||||
|
end
|
||||||
|
|
||||||
|
test "tries to get a user by nickname if fetching by ap_id doesn't work" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"})
|
||||||
|
|
||||||
|
{:ok, user} =
|
||||||
|
user
|
||||||
|
|> Ecto.Changeset.change(%{ap_id: "#{user.ap_id}/extension/#{user.nickname}"})
|
||||||
|
|> Repo.update()
|
||||||
|
|
||||||
|
Cachex.clear(:user_cache)
|
||||||
|
|
||||||
|
result = ActivityView.render("activity.json", activity: activity)
|
||||||
|
assert result["user"]["id"] == user.id
|
||||||
|
end
|
||||||
|
|
||||||
test "a create activity with a html status" do
|
test "a create activity with a html status" do
|
||||||
text = """
|
text = """
|
||||||
#Bike log - Commute Tuesday\nhttps://pla.bike/posts/20181211/\n#cycling #CHScycling #commute\nMVIMG_20181211_054020.jpg
|
#Bike log - Commute Tuesday\nhttps://pla.bike/posts/20181211/\n#cycling #CHScycling #commute\nMVIMG_20181211_054020.jpg
|
||||||
|
|
Loading…
Reference in a new issue