Browse Source

Make TwAPI UserView more resilient to issues.

Will work for missing users and badly migrated users.
tags/v0.9.9
lain 5 years ago
parent
commit
7382adf407
3 changed files with 52 additions and 1 deletions
  1. +9
    -0
      lib/pleroma/user.ex
  2. +15
    -1
      lib/pleroma/web/twitter_api/views/activity_view.ex
  3. +28
    -0
      test/web/twitter_api/views/activity_view_test.exs

+ 9
- 0
lib/pleroma/user.ex View File

@@ -367,6 +367,15 @@ defmodule Pleroma.User do
Repo.get_by(User, ap_id: ap_id)
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
with {:ok, user} <- Repo.update(changeset) do
Cachex.put(:user_cache, "ap_id:#{user.ap_id}", user)


+ 15
- 1
lib/pleroma/web/twitter_api/views/activity_view.ex View File

@@ -94,11 +94,25 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
ap_id == "https://www.w3.org/ns/activitystreams#Public" ->
nil

user = User.get_cached_by_ap_id(ap_id) ->
user

user = User.get_by_guessed_nickname(ap_id) ->
user

true ->
User.get_cached_by_ap_id(ap_id)
error_user()
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
context_ids = collect_context_ids(opts.activities)
users = collect_users(opts.activities)


+ 28
- 0
test/web/twitter_api/views/activity_view_test.exs View File

@@ -25,6 +25,34 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do

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
text = """
#Bike log - Commute Tuesday\nhttps://pla.bike/posts/20181211/\n#cycling #CHScycling #commute\nMVIMG_20181211_054020.jpg


Loading…
Cancel
Save